diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__angular__example1.ts.json index a4cdb2919..139dfb8f4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessibility · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
\n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n
\n \n
\n \n \n
\n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, OnInit, ViewChild} from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n hotData: Handsontable.RowObject[] = [];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const products = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'French Southern Territories',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'French Southern Territories',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n ];\n\n const countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n }, [] as string[]);\n\n this.hotData = [...products];\n\n this.hotSettings = {\n height: 464,\n colWidths: [160, 165, 130, 100, 100, 110, 216],\n autoRowSize: true,\n colHeaders: [\n 'Company name',\n 'Product name',\n 'Sell date',\n 'In stock',\n 'Qty',\n 'Order ID',\n 'Country',\n ],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true,\n tabNavigation: true,\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n }\n\n // Initialize the Handsontable instance with the specified configuration options\n\n const setupCheckbox = (element: HTMLInputElement | null, callback: (checked: boolean) => void) =>\n element?.addEventListener('click', () => callback(element.checked));\n\n // Set up event listeners for various checkboxes to update Handsontable settings.\n // This allows us to change the Handsontable settings from the UI, showcasing\n // the flexibility of Handsontable in configuring according to your needs.\n // Checkbox: Enable/Disable Tab Navigation\n setupCheckbox(document.querySelector('#enable-tab-navigation'), (checked: boolean) => {\n this.hotSettings['tabNavigation'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n tabNavigation: this.hotSettings['tabNavigation'],\n });\n console.log(\n 'Updated setting: tabNavigation to',\n this.hotTable.hotInstance!.getSettings().tabNavigation\n );\n });\n // Checkbox: Enable/Disable Header Navigation\n setupCheckbox(\n document.querySelector('#enable-header-navigation'),\n (checked: boolean) => {\n this.hotSettings['navigableHeaders'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n navigableHeaders: this.hotSettings['navigableHeaders'],\n });\n console.log(\n 'Updated setting: navigableHeaders to',\n this.hotTable.hotInstance!.getSettings().navigableHeaders\n );\n }\n );\n\n // Checkbox: Enable/Disable Cell Virtualization\n setupCheckbox(\n document.querySelector('#enable-cell-virtualization'),\n (checked: boolean) => {\n this.hotTable.hotInstance!.updateSettings({\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: this.hotTable.hotInstance!.getSettings().renderAllRows,\n renderAllColumns: this.hotTable.hotInstance!.getSettings().renderAllColumns,\n });\n }\n );\n // Checkbox: Enable/Disable Cell Enter Editing\n setupCheckbox(\n document.querySelector('#enable-cell-enter-editing'),\n (checked: boolean) => {\n this.hotSettings['enterBeginsEditing'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n enterBeginsEditing: this.hotSettings['enterBeginsEditing'],\n });\n console.log(\n 'Updated setting: enable-cell-enter-editing to',\n this.hotTable.hotInstance!.getSettings().enterBeginsEditing\n );\n }\n );\n // Checkbox: Enable/Disable Arrow Navigation for First/Last Row\n setupCheckbox(\n document.querySelector('#enable-arrow-rl-first-last-column'),\n (checked: boolean) => {\n this.hotSettings['autoWrapRow'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n autoWrapRow: this.hotSettings['autoWrapRow'],\n });\n console.log(\n 'Updated setting: autoWrapRow to',\n this.hotTable.hotInstance!.getSettings().autoWrapRow\n );\n }\n );\n // Checkbox: Enable/Disable Arrow Navigation for First/Last Column\n setupCheckbox(\n document.querySelector('#enable-arrow-td-first-last-column'),\n (checked: boolean) => {\n this.hotSettings['autoWrapCol'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n autoWrapCol: this.hotSettings['autoWrapCol'],\n });\n console.log(\n 'Updated setting: autoWrapCol to',\n this.hotTable.hotInstance!.getSettings().autoWrapCol\n );\n }\n );\n // Checkbox: Enable/Disable Enter Key Focus for Editing\n setupCheckbox(\n document.querySelector('#enable-enter-focus-editing'),\n (checked: boolean) => {\n this.hotSettings['enterMoves'] = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n this.hotTable.hotInstance!.updateSettings({\n enterMoves: this.hotSettings['enterMoves'],\n });\n console.log('Updated setting: enterMoves to', this.hotTable.hotInstance!.getSettings().enterMoves);\n }\n );\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessibility/accessibility/angular/example1.ts","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"Angular"} +{"framework":"angular","displayName":"Accessibility · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
\n \n
\n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n
\n \n
\n \n \n
\n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, OnInit, ViewChild} from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n hotData: Handsontable.RowObject[] = [];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const products = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'French Southern Territories',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'French Southern Territories',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n ];\n\n const countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n }, [] as string[]);\n\n this.hotData = [...products];\n\n this.hotSettings = {\n height: 464,\n colWidths: [160, 165, 130, 100, 100, 110, 216],\n autoRowSize: true,\n colHeaders: [\n 'Company name',\n 'Product name',\n 'Sell date',\n 'In stock',\n 'Qty',\n 'Order ID',\n 'Country',\n ],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true,\n tabNavigation: true,\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n }\n\n // Initialize the Handsontable instance with the specified configuration options\n\n const setupCheckbox = (element: HTMLInputElement | null, callback: (checked: boolean) => void) =>\n element?.addEventListener('click', () => callback(element.checked));\n\n // Set up event listeners for various checkboxes to update Handsontable settings.\n // This allows us to change the Handsontable settings from the UI, showcasing\n // the flexibility of Handsontable in configuring according to your needs.\n // Checkbox: Enable/Disable Tab Navigation\n setupCheckbox(document.querySelector('#enable-tab-navigation'), (checked: boolean) => {\n this.hotSettings['tabNavigation'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n tabNavigation: this.hotSettings['tabNavigation'],\n });\n console.log(\n 'Updated setting: tabNavigation to',\n this.hotTable.hotInstance!.getSettings().tabNavigation\n );\n });\n // Checkbox: Enable/Disable Header Navigation\n setupCheckbox(\n document.querySelector('#enable-header-navigation'),\n (checked: boolean) => {\n this.hotSettings['navigableHeaders'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n navigableHeaders: this.hotSettings['navigableHeaders'],\n });\n console.log(\n 'Updated setting: navigableHeaders to',\n this.hotTable.hotInstance!.getSettings().navigableHeaders\n );\n }\n );\n\n // Checkbox: Enable/Disable Cell Virtualization\n setupCheckbox(\n document.querySelector('#enable-cell-virtualization'),\n (checked: boolean) => {\n this.hotTable.hotInstance!.updateSettings({\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: this.hotTable.hotInstance!.getSettings().renderAllRows,\n renderAllColumns: this.hotTable.hotInstance!.getSettings().renderAllColumns,\n });\n }\n );\n // Checkbox: Enable/Disable Cell Enter Editing\n setupCheckbox(\n document.querySelector('#enable-cell-enter-editing'),\n (checked: boolean) => {\n this.hotSettings['enterBeginsEditing'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n enterBeginsEditing: this.hotSettings['enterBeginsEditing'],\n });\n console.log(\n 'Updated setting: enable-cell-enter-editing to',\n this.hotTable.hotInstance!.getSettings().enterBeginsEditing\n );\n }\n );\n // Checkbox: Enable/Disable Arrow Navigation for First/Last Row\n setupCheckbox(\n document.querySelector('#enable-arrow-rl-first-last-column'),\n (checked: boolean) => {\n this.hotSettings['autoWrapRow'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n autoWrapRow: this.hotSettings['autoWrapRow'],\n });\n console.log(\n 'Updated setting: autoWrapRow to',\n this.hotTable.hotInstance!.getSettings().autoWrapRow\n );\n }\n );\n // Checkbox: Enable/Disable Arrow Navigation for First/Last Column\n setupCheckbox(\n document.querySelector('#enable-arrow-td-first-last-column'),\n (checked: boolean) => {\n this.hotSettings['autoWrapCol'] = checked;\n this.hotTable.hotInstance!.updateSettings({\n autoWrapCol: this.hotSettings['autoWrapCol'],\n });\n console.log(\n 'Updated setting: autoWrapCol to',\n this.hotTable.hotInstance!.getSettings().autoWrapCol\n );\n }\n );\n // Checkbox: Enable/Disable Enter Key Focus for Editing\n setupCheckbox(\n document.querySelector('#enable-enter-focus-editing'),\n (checked: boolean) => {\n this.hotSettings['enterMoves'] = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n this.hotTable.hotInstance!.updateSettings({\n enterMoves: this.hotSettings['enterMoves'],\n });\n console.log('Updated setting: enterMoves to', this.hotTable.hotInstance!.getSettings().enterMoves);\n }\n );\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessibility/accessibility/angular/example1.ts","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.js.json index 85b0b5637..3cb1eed96 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessibility · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n Enable navigation with the Tab key\n \n \n \n \n \n \n \n
\n
\n \n \n Enable navigation across headers\n \n \n \n \n \n \n \n
\n
\n \n \n Enable cells virtualization\n \n \n \n \n \n \n \n
\n
\n \n The Enter key begins cell editing\n \n \n \n \n \n \n \n
\n
\n \n The right/left arrow keys wrap focus to the adjacent row\n \n \n \n \n \n \n \n
\n
\n \n \n The up/down arrow keys wrap focus to the adjacent column\n \n \n \n \n \n \n \n
\n
\n \n \n The Enter key moves the focus after cell edition\n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n \n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst products = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst app = document.getElementById('example1');\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data: products,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true,\n tabNavigation: true,\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\nlet hot = new Handsontable(app, hotOptions);\n// Helper function to set up checkbox event handling\nconst setupCheckbox = (element, callback) => element.addEventListener('click', () => callback(element.checked));\n\n// Set up event listeners for various checkboxes to update Handsontable settings.\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\n// Checkbox: Enable/Disable Tab Navigation\nsetupCheckbox(document.querySelector('#enable-tab-navigation'), (checked) => {\n hotOptions.tabNavigation = checked;\n hot.updateSettings({\n tabNavigation: hotOptions.tabNavigation,\n });\n console.log('Updated setting: tabNavigation to', hot.getSettings().tabNavigation);\n});\n// Checkbox: Enable/Disable Header Navigation\nsetupCheckbox(document.querySelector('#enable-header-navigation'), (checked) => {\n hotOptions.navigableHeaders = checked;\n hot.updateSettings({\n navigableHeaders: hotOptions.navigableHeaders,\n });\n console.log('Updated setting: navigableHeaders to', hot.getSettings().navigableHeaders);\n});\n// Checkbox: Enable/Disable Cell Virtualization\nsetupCheckbox(document.querySelector('#enable-cell-virtualization'), (checked) => {\n hot.destroy();\n hot = new Handsontable(document.getElementById('example1'), {\n ...hotOptions,\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: hot.getSettings().renderAllRows,\n renderAllColumns: hot.getSettings().renderAllColumns,\n });\n});\n// Checkbox: Enable/Disable Cell Enter Editing\nsetupCheckbox(document.querySelector('#enable-cell-enter-editing'), (checked) => {\n hotOptions.enterBeginsEditing = checked;\n hot.updateSettings({\n enterBeginsEditing: hotOptions.enterBeginsEditing,\n });\n console.log('Updated setting: enable-cell-enter-editing to', hot.getSettings().enterBeginsEditing);\n});\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Row\nsetupCheckbox(document.querySelector('#enable-arrow-rl-first-last-column'), (checked) => {\n hotOptions.autoWrapRow = checked;\n hot.updateSettings({\n autoWrapRow: hotOptions.autoWrapRow,\n });\n console.log('Updated setting: autoWrapRow to', hot.getSettings().autoWrapRow);\n});\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Column\nsetupCheckbox(document.querySelector('#enable-arrow-td-first-last-column'), (checked) => {\n hotOptions.autoWrapCol = checked;\n hot.updateSettings({\n autoWrapCol: hotOptions.autoWrapCol,\n });\n console.log('Updated setting: autoWrapCol to', hot.getSettings().autoWrapCol);\n});\n// Checkbox: Enable/Disable Enter Key Focus for Editing\nsetupCheckbox(document.querySelector('#enable-enter-focus-editing'), (checked) => {\n hotOptions.enterMoves = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n hot.updateSettings({\n enterMoves: hotOptions.enterMoves,\n });\n console.log('Updated setting: enterMoves to', hot.getSettings().enterMoves);\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/javascript/example1.js","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessibility · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n Enable navigation with the Tab key\n \n \n \n \n \n \n \n
\n
\n \n \n Enable navigation across headers\n \n \n \n \n \n \n \n
\n
\n \n \n Enable cells virtualization\n \n \n \n \n \n \n \n
\n
\n \n The Enter key begins cell editing\n \n \n \n \n \n \n \n
\n
\n \n The right/left arrow keys wrap focus to the adjacent row\n \n \n \n \n \n \n \n
\n
\n \n \n The up/down arrow keys wrap focus to the adjacent column\n \n \n \n \n \n \n \n
\n
\n \n \n The Enter key moves the focus after cell edition\n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n \n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst products = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst app = document.getElementById('example1');\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data: products,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true,\n tabNavigation: true,\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\nlet hot = new Handsontable(app, hotOptions);\n// Helper function to set up checkbox event handling\nconst setupCheckbox = (element, callback) => element.addEventListener('click', () => callback(element.checked));\n\n// Set up event listeners for various checkboxes to update Handsontable settings.\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\n// Checkbox: Enable/Disable Tab Navigation\nsetupCheckbox(document.querySelector('#enable-tab-navigation'), (checked) => {\n hotOptions.tabNavigation = checked;\n hot.updateSettings({\n tabNavigation: hotOptions.tabNavigation,\n });\n console.log('Updated setting: tabNavigation to', hot.getSettings().tabNavigation);\n});\n// Checkbox: Enable/Disable Header Navigation\nsetupCheckbox(document.querySelector('#enable-header-navigation'), (checked) => {\n hotOptions.navigableHeaders = checked;\n hot.updateSettings({\n navigableHeaders: hotOptions.navigableHeaders,\n });\n console.log('Updated setting: navigableHeaders to', hot.getSettings().navigableHeaders);\n});\n// Checkbox: Enable/Disable Cell Virtualization\nsetupCheckbox(document.querySelector('#enable-cell-virtualization'), (checked) => {\n hot.destroy();\n hot = new Handsontable(document.getElementById('example1'), {\n ...hotOptions,\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: hot.getSettings().renderAllRows,\n renderAllColumns: hot.getSettings().renderAllColumns,\n });\n});\n// Checkbox: Enable/Disable Cell Enter Editing\nsetupCheckbox(document.querySelector('#enable-cell-enter-editing'), (checked) => {\n hotOptions.enterBeginsEditing = checked;\n hot.updateSettings({\n enterBeginsEditing: hotOptions.enterBeginsEditing,\n });\n console.log('Updated setting: enable-cell-enter-editing to', hot.getSettings().enterBeginsEditing);\n});\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Row\nsetupCheckbox(document.querySelector('#enable-arrow-rl-first-last-column'), (checked) => {\n hotOptions.autoWrapRow = checked;\n hot.updateSettings({\n autoWrapRow: hotOptions.autoWrapRow,\n });\n console.log('Updated setting: autoWrapRow to', hot.getSettings().autoWrapRow);\n});\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Column\nsetupCheckbox(document.querySelector('#enable-arrow-td-first-last-column'), (checked) => {\n hotOptions.autoWrapCol = checked;\n hot.updateSettings({\n autoWrapCol: hotOptions.autoWrapCol,\n });\n console.log('Updated setting: autoWrapCol to', hot.getSettings().autoWrapCol);\n});\n// Checkbox: Enable/Disable Enter Key Focus for Editing\nsetupCheckbox(document.querySelector('#enable-enter-focus-editing'), (checked) => {\n hotOptions.enterMoves = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n hot.updateSettings({\n enterMoves: hotOptions.enterMoves,\n });\n console.log('Updated setting: enterMoves to', hot.getSettings().enterMoves);\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/javascript/example1.js","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.ts.json index 51fa96cd9..e340cadcf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessibility · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n Enable navigation with the Tab key\n \n \n \n \n \n \n \n
\n
\n \n \n Enable navigation across headers\n \n \n \n \n \n \n \n
\n
\n \n \n Enable cells virtualization\n \n \n \n \n \n \n \n
\n
\n \n The Enter key begins cell editing\n \n \n \n \n \n \n \n
\n
\n \n The right/left arrow keys wrap focus to the adjacent row\n \n \n \n \n \n \n \n
\n
\n \n \n The up/down arrow keys wrap focus to the adjacent column\n \n \n \n \n \n \n \n
\n
\n \n \n The Enter key moves the focus after cell edition\n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n \n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\ninterface Product {\n companyName: string;\n productName: string;\n sellDate: string;\n inStock: boolean;\n qty: number;\n orderId: string;\n country: string;\n}\n\n/* start:skip-in-preview */\nconst products: Product[] = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst app = document.getElementById('example1')!;\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data: products,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true, // New accessibility feature\n tabNavigation: true, // New accessibility feature\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\nlet hot = new Handsontable(app, hotOptions);\n\n// Helper function to set up checkbox event handling\nconst setupCheckbox = (element: HTMLInputElement, callback: (val: boolean) => void) =>\n element.addEventListener('click', () => callback(element.checked));\n\n// Set up event listeners for various checkboxes to update Handsontable settings.\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\n\n// Checkbox: Enable/Disable Tab Navigation\nsetupCheckbox(document.querySelector('#enable-tab-navigation') as HTMLInputElement, (checked) => {\n hotOptions.tabNavigation = checked;\n hot.updateSettings({\n tabNavigation: hotOptions.tabNavigation,\n });\n console.log('Updated setting: tabNavigation to', hot.getSettings().tabNavigation);\n});\n\n// Checkbox: Enable/Disable Header Navigation\nsetupCheckbox(document.querySelector('#enable-header-navigation') as HTMLInputElement, (checked) => {\n hotOptions.navigableHeaders = checked;\n hot.updateSettings({\n navigableHeaders: hotOptions.navigableHeaders,\n });\n console.log('Updated setting: navigableHeaders to', hot.getSettings().navigableHeaders);\n});\n\n// Checkbox: Enable/Disable Cell Virtualization\nsetupCheckbox(document.querySelector('#enable-cell-virtualization') as HTMLInputElement, (checked) => {\n hot.destroy();\n hot = new Handsontable(document.getElementById('example1')!, {\n ...hotOptions,\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: hot.getSettings().renderAllRows,\n renderAllColumns: hot.getSettings().renderAllColumns,\n });\n});\n\n// Checkbox: Enable/Disable Cell Enter Editing\nsetupCheckbox(document.querySelector('#enable-cell-enter-editing') as HTMLInputElement, (checked) => {\n hotOptions.enterBeginsEditing = checked;\n hot.updateSettings({\n enterBeginsEditing: hotOptions.enterBeginsEditing,\n });\n console.log('Updated setting: enable-cell-enter-editing to', hot.getSettings().enterBeginsEditing);\n});\n\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Row\nsetupCheckbox(document.querySelector('#enable-arrow-rl-first-last-column') as HTMLInputElement, (checked) => {\n hotOptions.autoWrapRow = checked;\n hot.updateSettings({\n autoWrapRow: hotOptions.autoWrapRow,\n });\n console.log('Updated setting: autoWrapRow to', hot.getSettings().autoWrapRow);\n});\n\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Column\nsetupCheckbox(document.querySelector('#enable-arrow-td-first-last-column') as HTMLInputElement, (checked) => {\n hotOptions.autoWrapCol = checked;\n hot.updateSettings({\n autoWrapCol: hotOptions.autoWrapCol,\n });\n console.log('Updated setting: autoWrapCol to', hot.getSettings().autoWrapCol);\n});\n\n// Checkbox: Enable/Disable Enter Key Focus for Editing\nsetupCheckbox(document.querySelector('#enable-enter-focus-editing') as HTMLInputElement, (checked) => {\n hotOptions.enterMoves = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n hot.updateSettings({\n enterMoves: hotOptions.enterMoves,\n });\n console.log('Updated setting: enterMoves to', hot.getSettings().enterMoves);\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/javascript/example1.ts","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessibility · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n Enable navigation with the Tab key\n \n \n \n \n \n \n \n
\n
\n \n \n Enable navigation across headers\n \n \n \n \n \n \n \n
\n
\n \n \n Enable cells virtualization\n \n \n \n \n \n \n \n
\n
\n \n The Enter key begins cell editing\n \n \n \n \n \n \n \n
\n
\n \n The right/left arrow keys wrap focus to the adjacent row\n \n \n \n \n \n \n \n
\n
\n \n \n The up/down arrow keys wrap focus to the adjacent column\n \n \n \n \n \n \n \n
\n
\n \n \n The Enter key moves the focus after cell edition\n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n \n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\ninterface Product {\n companyName: string;\n productName: string;\n sellDate: string;\n inStock: boolean;\n qty: number;\n orderId: string;\n country: string;\n}\n\n/* start:skip-in-preview */\nconst products: Product[] = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = products.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst app = document.getElementById('example1')!;\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data: products,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n columns: [\n { data: 'companyName', type: 'text' },\n { data: 'productName', type: 'text' },\n {\n data: 'sellDate',\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 'inStock',\n type: 'checkbox',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n {\n data: 'qty',\n type: 'numeric',\n headerClassName: 'htRight',\n },\n {\n data: 'orderId',\n type: 'text',\n },\n {\n data: 'country',\n type: 'dropdown',\n source: countries,\n },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n contextMenu: true,\n navigableHeaders: true, // New accessibility feature\n tabNavigation: true, // New accessibility feature\n autoWrapRow: true,\n autoWrapCol: true,\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\nlet hot = new Handsontable(app, hotOptions);\n\n// Helper function to set up checkbox event handling\nconst setupCheckbox = (element: HTMLInputElement, callback: (val: boolean) => void) =>\n element.addEventListener('click', () => callback(element.checked));\n\n// Set up event listeners for various checkboxes to update Handsontable settings.\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\n\n// Checkbox: Enable/Disable Tab Navigation\nsetupCheckbox(document.querySelector('#enable-tab-navigation') as HTMLInputElement, (checked) => {\n hotOptions.tabNavigation = checked;\n hot.updateSettings({\n tabNavigation: hotOptions.tabNavigation,\n });\n console.log('Updated setting: tabNavigation to', hot.getSettings().tabNavigation);\n});\n\n// Checkbox: Enable/Disable Header Navigation\nsetupCheckbox(document.querySelector('#enable-header-navigation') as HTMLInputElement, (checked) => {\n hotOptions.navigableHeaders = checked;\n hot.updateSettings({\n navigableHeaders: hotOptions.navigableHeaders,\n });\n console.log('Updated setting: navigableHeaders to', hot.getSettings().navigableHeaders);\n});\n\n// Checkbox: Enable/Disable Cell Virtualization\nsetupCheckbox(document.querySelector('#enable-cell-virtualization') as HTMLInputElement, (checked) => {\n hot.destroy();\n hot = new Handsontable(document.getElementById('example1')!, {\n ...hotOptions,\n renderAllRows: !checked,\n renderAllColumns: !checked,\n });\n console.log('Updated virtualization settings:', {\n renderAllRows: hot.getSettings().renderAllRows,\n renderAllColumns: hot.getSettings().renderAllColumns,\n });\n});\n\n// Checkbox: Enable/Disable Cell Enter Editing\nsetupCheckbox(document.querySelector('#enable-cell-enter-editing') as HTMLInputElement, (checked) => {\n hotOptions.enterBeginsEditing = checked;\n hot.updateSettings({\n enterBeginsEditing: hotOptions.enterBeginsEditing,\n });\n console.log('Updated setting: enable-cell-enter-editing to', hot.getSettings().enterBeginsEditing);\n});\n\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Row\nsetupCheckbox(document.querySelector('#enable-arrow-rl-first-last-column') as HTMLInputElement, (checked) => {\n hotOptions.autoWrapRow = checked;\n hot.updateSettings({\n autoWrapRow: hotOptions.autoWrapRow,\n });\n console.log('Updated setting: autoWrapRow to', hot.getSettings().autoWrapRow);\n});\n\n// Checkbox: Enable/Disable Arrow Navigation for First/Last Column\nsetupCheckbox(document.querySelector('#enable-arrow-td-first-last-column') as HTMLInputElement, (checked) => {\n hotOptions.autoWrapCol = checked;\n hot.updateSettings({\n autoWrapCol: hotOptions.autoWrapCol,\n });\n console.log('Updated setting: autoWrapCol to', hot.getSettings().autoWrapCol);\n});\n\n// Checkbox: Enable/Disable Enter Key Focus for Editing\nsetupCheckbox(document.querySelector('#enable-enter-focus-editing') as HTMLInputElement, (checked) => {\n hotOptions.enterMoves = checked ? { col: 0, row: 1 } : { col: 0, row: 0 };\n hot.updateSettings({\n enterMoves: hotOptions.enterMoves,\n });\n console.log('Updated setting: enterMoves to', hot.getSettings().enterMoves);\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/javascript/example1.ts","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/accessibility","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__react__example2.tsx.json index 6aa72a66f..c54940bae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessibility · Accessible data grid demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ninterface Toggle {\n tabNavigation: boolean;\n navigableHeaders: boolean;\n renderAllRows: boolean;\n renderAllColumns: boolean;\n enterBeginsEditing: boolean;\n autoWrapRow: boolean;\n autoWrapCol: boolean;\n enterMoves: { col: number; row: number };\n changeToggleOptions: any;\n}\n\ninterface Product {\n companyName: string;\n productName: string;\n sellDate: string;\n inStock: boolean;\n qty: number;\n orderId: string;\n country: string;\n}\n\n/* start:skip-in-preview */\nconst data: Product[] = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = data.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n\n// Handsontable options\nconst hotOptions = {\n data,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst ExampleComponent = () => {\n const [toggleableOptions, setToggleableOptions] = useState>({\n tabNavigation: true,\n navigableHeaders: true,\n renderAllRows: false,\n renderAllColumns: false,\n enterBeginsEditing: true,\n autoWrapRow: true,\n autoWrapCol: true,\n headerClassName: 'htLeft',\n enterMoves: { col: 0, row: 1 },\n });\n\n return (\n
\n {/* DemoOptions component for changing Handsontable options */}\n \n\n \n\n {/* Handsontable component with dynamic options */}\n \n {/* Define HotColumns for the data */}\n \n \n \n \n \n \n \n \n \n
\n );\n};\n\n// Demo Options allows you to change the Handsontable options\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\nfunction DemoOptions({\n tabNavigation,\n navigableHeaders,\n renderAllRows,\n renderAllColumns,\n enterBeginsEditing,\n autoWrapRow,\n autoWrapCol,\n enterMoves,\n changeToggleOptions,\n}: Toggle) {\n // on checkbox change, update handsontable option\n const handleCheckboxChange = (checkboxName: string) => {\n switch (checkboxName) {\n case 'enable-tab-navigation':\n changeToggleOptions((existing: any) => ({\n ...existing,\n tabNavigation: !tabNavigation,\n }));\n\n break;\n case 'enable-header-navigation':\n changeToggleOptions((existing: any) => ({\n ...existing,\n navigableHeaders: !navigableHeaders,\n }));\n\n break;\n case 'enable-cell-virtualization':\n changeToggleOptions((existing: any) => ({\n ...existing,\n renderAllRows: !renderAllRows,\n renderAllColumns: !renderAllColumns,\n }));\n\n break;\n case 'enable-cell-enter-editing':\n changeToggleOptions((existing: any) => ({\n ...existing,\n enterBeginsEditing: !enterBeginsEditing,\n }));\n\n break;\n case 'enable-arrow-rl-first-last-column':\n changeToggleOptions((existing: any) => ({\n ...existing,\n autoWrapRow: !autoWrapRow,\n }));\n\n break;\n case 'enable-arrow-td-first-last-column':\n changeToggleOptions((existing: any) => ({\n ...existing,\n autoWrapCol: !autoWrapCol,\n }));\n\n break;\n case 'enable-enter-focus-editing':\n changeToggleOptions((existing: any) => ({\n ...existing,\n enterMoves: enterMoves.row !== 1 ? { col: 0, row: 1 } : { col: 0, row: 0 },\n }));\n\n break;\n default:\n break;\n }\n };\n\n return (\n <>\n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n );\n}\n\nexport default ExampleComponent;","/src/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/react/example2.tsx","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example2","exampleTitle":"Accessible data grid demo","docPermalink":"/accessibility","lang":"React (TS)"} +{"framework":"react","displayName":"Accessibility · Accessible data grid demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ninterface Toggle {\n tabNavigation: boolean;\n navigableHeaders: boolean;\n renderAllRows: boolean;\n renderAllColumns: boolean;\n enterBeginsEditing: boolean;\n autoWrapRow: boolean;\n autoWrapCol: boolean;\n enterMoves: { col: number; row: number };\n changeToggleOptions: any;\n}\n\ninterface Product {\n companyName: string;\n productName: string;\n sellDate: string;\n inStock: boolean;\n qty: number;\n orderId: string;\n country: string;\n}\n\n/* start:skip-in-preview */\nconst data: Product[] = [\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-07-05',\n inStock: false,\n qty: 82,\n orderId: '16-3974628',\n country: 'United Kingdom',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-05-31',\n inStock: false,\n qty: 459,\n orderId: '77-7839351',\n country: 'Costa Rica',\n },\n {\n companyName: 'Reichert LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-16',\n inStock: false,\n qty: 318,\n orderId: '75-6343150',\n country: 'United States of America',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-24',\n inStock: true,\n qty: 177,\n orderId: '56-3608689',\n country: 'Pitcairn Islands',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-29',\n inStock: true,\n qty: 51,\n orderId: '58-1204318',\n country: 'Argentina',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-03-27',\n inStock: false,\n qty: 439,\n orderId: '62-6066132',\n country: 'Senegal',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Awesome Wooden Hat',\n sellDate: '2022-11-24',\n inStock: false,\n qty: 493,\n orderId: '76-7785471',\n country: 'Cyprus',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-08-11',\n inStock: false,\n qty: 225,\n orderId: '34-3551159',\n country: 'Saint Martin',\n },\n {\n companyName: 'Hodkiewicz - Hintz',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-02-07',\n inStock: false,\n qty: 261,\n orderId: '77-1112514',\n country: 'Chile',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-06',\n inStock: false,\n qty: 439,\n orderId: '12-3252385',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-04-22',\n inStock: true,\n qty: 235,\n orderId: '71-7639998',\n country: 'Brazil',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2022-12-13',\n inStock: true,\n qty: 163,\n orderId: '68-1588829',\n country: 'Burkina Faso',\n },\n {\n companyName: 'Jenkins LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-03-26',\n inStock: true,\n qty: 8,\n orderId: '61-6324553',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 355,\n orderId: '74-6985005',\n country: 'Mozambique',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-08-01',\n inStock: false,\n qty: 186,\n orderId: '84-4370131',\n country: 'Cocos (Keeling) Islands',\n },\n {\n companyName: 'Rempel - Durgan',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 284,\n orderId: '13-6461825',\n country: 'Monaco',\n },\n {\n companyName: 'Lesch - Jakubowski',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-09-26',\n inStock: true,\n qty: 492,\n orderId: '13-9465439',\n country: 'Iran',\n },\n {\n companyName: 'Jacobi - Kutch',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-05-04',\n inStock: true,\n qty: 300,\n orderId: '76-5194058',\n country: 'Indonesia',\n },\n {\n companyName: 'Gerhold - Rowe',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-07-07',\n inStock: true,\n qty: 493,\n orderId: '61-8600792',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Johnston - Wisozk',\n productName: 'Small Fresh Fish',\n sellDate: '2023-07-14',\n inStock: false,\n qty: 304,\n orderId: '10-6007287',\n country: 'Romania',\n },\n {\n companyName: 'Gutkowski Inc',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-01-10',\n inStock: true,\n qty: 375,\n orderId: '25-1164132',\n country: 'Afghanistan',\n },\n {\n companyName: 'Koepp and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-03-30',\n inStock: false,\n qty: 365,\n orderId: '75-7975820',\n country: 'Germany',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Small Fresh Fish',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 308,\n orderId: '59-6251875',\n country: 'Tajikistan',\n },\n {\n companyName: 'Mills Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 191,\n orderId: '67-7521441',\n country: 'Puerto Rico',\n },\n {\n companyName: 'Zboncak and Sons',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-03-18',\n inStock: false,\n qty: 208,\n orderId: '19-4264192',\n country: 'Bolivia',\n },\n {\n companyName: 'Rath LLC',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-06-14',\n inStock: true,\n qty: 191,\n orderId: '78-5742060',\n country: 'Benin',\n },\n {\n companyName: 'Upton - Reichert',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-02-27',\n inStock: false,\n qty: 45,\n orderId: '26-6191298',\n country: 'Tunisia',\n },\n {\n companyName: 'Carroll Group',\n productName: 'Rustic Soft Ball',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 385,\n orderId: '13-7828353',\n country: 'Switzerland',\n },\n {\n companyName: 'Reichel Group',\n productName: 'Small Frozen Tuna',\n sellDate: '2022-12-12',\n inStock: true,\n qty: 117,\n orderId: '67-9643738',\n country: 'Mongolia',\n },\n {\n companyName: 'Kozey Inc',\n productName: 'Rustic Soft Ball',\n sellDate: '2023-03-24',\n inStock: false,\n qty: 335,\n orderId: '78-1331653',\n country: 'Angola',\n },\n {\n companyName: 'Brown LLC',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-06-13',\n inStock: true,\n qty: 305,\n orderId: '63-2315723',\n country: 'Switzerland',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-07',\n inStock: true,\n qty: 409,\n orderId: '53-6782557',\n country: 'Indonesia',\n },\n {\n companyName: 'OReilly LLC',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-05-18',\n inStock: true,\n qty: 318,\n orderId: '91-7787675',\n country: 'Mayotte',\n },\n {\n companyName: 'Weber Inc',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-04-20',\n inStock: false,\n qty: 234,\n orderId: '41-3560672',\n country: 'Switzerland',\n },\n {\n companyName: 'Hodkiewicz Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-10-19',\n inStock: true,\n qty: 136,\n orderId: '48-6028776',\n country: 'Peru',\n },\n {\n companyName: 'Lesch and Sons',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-09-29',\n inStock: false,\n qty: 187,\n orderId: '84-3770456',\n country: 'Central African Republic',\n },\n {\n companyName: 'Pouros - Brakus',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-01-29',\n inStock: false,\n qty: 350,\n orderId: '08-4844950',\n country: 'Isle of Man',\n },\n {\n companyName: 'Batz - Rice',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-11-06',\n inStock: false,\n qty: 252,\n orderId: '88-4899852',\n country: 'Burundi',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Fresh Fish',\n sellDate: '2023-09-05',\n inStock: true,\n qty: 306,\n orderId: '06-5022461',\n country: 'Mauritius',\n },\n {\n companyName: 'Hills and Sons',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-11-07',\n inStock: false,\n qty: 435,\n orderId: '99-5539911',\n country: 'Somalia',\n },\n {\n companyName: 'Shanahan - Boyle',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-19',\n inStock: true,\n qty: 171,\n orderId: '82-8162453',\n country: 'Virgin Islands, U.S.',\n },\n {\n companyName: 'Luettgen Inc',\n productName: 'Awesome Wooden Hat',\n sellDate: '2023-09-30',\n inStock: false,\n qty: 6,\n orderId: '02-8118250',\n country: 'Colombia',\n },\n {\n companyName: 'Hegmann Inc',\n productName: 'Small Rubber Shoes',\n sellDate: '2023-02-16',\n inStock: true,\n qty: 278,\n orderId: '07-9773343',\n country: 'Central African Republic',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-08-08',\n inStock: false,\n qty: 264,\n orderId: '66-4470479',\n country: 'Norfolk Island',\n },\n {\n companyName: 'Kub Inc',\n productName: 'Tasty Frozen Table',\n sellDate: '2023-06-06',\n inStock: true,\n qty: 494,\n orderId: '13-1175339',\n country: 'Liechtenstein',\n },\n {\n companyName: 'Hahn - Welch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-06-12',\n inStock: false,\n qty: 485,\n orderId: '32-9127309',\n country: 'Bahrain',\n },\n {\n companyName: 'Nader - Fritsch',\n productName: 'Small Frozen Tuna',\n sellDate: '2023-04-08',\n inStock: true,\n qty: 332,\n orderId: '41-3774568',\n country: 'Montserrat',\n },\n {\n companyName: 'Crona and Sons',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-06-21',\n inStock: true,\n qty: 104,\n orderId: '48-9995090',\n country: 'Syrian Arab Republic',\n },\n {\n companyName: 'Lind Group',\n productName: 'Rustic Cotton Ball',\n sellDate: '2023-08-17',\n inStock: false,\n qty: 51,\n orderId: '68-9599400',\n country: 'Czech Republic',\n },\n {\n companyName: 'Labadie LLC',\n productName: 'Small Fresh Bacon',\n sellDate: '2023-04-20',\n inStock: true,\n qty: 155,\n orderId: '52-4334332',\n country: 'Croatia',\n },\n {\n companyName: 'Doyle Group',\n productName: 'Sleek Wooden Bacon',\n sellDate: '2023-07-23',\n inStock: false,\n qty: 465,\n orderId: '63-8894526',\n country: 'Indonesia',\n },\n];\n\nconst countries = data.reduce((acc, curr) => {\n if (acc.includes(curr.country)) {\n return acc;\n }\n\n return [...acc, curr.country];\n}, []);\n\n/* end:skip-in-preview */\n\n// Handsontable options\nconst hotOptions = {\n data,\n height: 464,\n colWidths: [160, 165, 130, 120, 100, 110, 216],\n autoRowSize: true,\n colHeaders: ['Company name', 'Product name', 'Sell date', 'In stock', 'Qty', 'Order ID', 'Country'],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst ExampleComponent = () => {\n const [toggleableOptions, setToggleableOptions] = useState>({\n tabNavigation: true,\n navigableHeaders: true,\n renderAllRows: false,\n renderAllColumns: false,\n enterBeginsEditing: true,\n autoWrapRow: true,\n autoWrapCol: true,\n headerClassName: 'htLeft',\n enterMoves: { col: 0, row: 1 },\n });\n\n return (\n
\n {/* DemoOptions component for changing Handsontable options */}\n \n\n \n\n {/* Handsontable component with dynamic options */}\n \n {/* Define HotColumns for the data */}\n \n \n \n \n \n \n \n \n \n
\n );\n};\n\n// Demo Options allows you to change the Handsontable options\n// This allows us to change the Handsontable settings from the UI, showcasing\n// the flexibility of Handsontable in configuring according to your needs.\nfunction DemoOptions({\n tabNavigation,\n navigableHeaders,\n renderAllRows,\n renderAllColumns,\n enterBeginsEditing,\n autoWrapRow,\n autoWrapCol,\n enterMoves,\n changeToggleOptions,\n}: Toggle) {\n // on checkbox change, update handsontable option\n const handleCheckboxChange = (checkboxName: string) => {\n switch (checkboxName) {\n case 'enable-tab-navigation':\n changeToggleOptions((existing: any) => ({\n ...existing,\n tabNavigation: !tabNavigation,\n }));\n\n break;\n case 'enable-header-navigation':\n changeToggleOptions((existing: any) => ({\n ...existing,\n navigableHeaders: !navigableHeaders,\n }));\n\n break;\n case 'enable-cell-virtualization':\n changeToggleOptions((existing: any) => ({\n ...existing,\n renderAllRows: !renderAllRows,\n renderAllColumns: !renderAllColumns,\n }));\n\n break;\n case 'enable-cell-enter-editing':\n changeToggleOptions((existing: any) => ({\n ...existing,\n enterBeginsEditing: !enterBeginsEditing,\n }));\n\n break;\n case 'enable-arrow-rl-first-last-column':\n changeToggleOptions((existing: any) => ({\n ...existing,\n autoWrapRow: !autoWrapRow,\n }));\n\n break;\n case 'enable-arrow-td-first-last-column':\n changeToggleOptions((existing: any) => ({\n ...existing,\n autoWrapCol: !autoWrapCol,\n }));\n\n break;\n case 'enable-enter-focus-editing':\n changeToggleOptions((existing: any) => ({\n ...existing,\n enterMoves: enterMoves.row !== 1 ? { col: 0, row: 1 } : { col: 0, row: 0 },\n }));\n\n break;\n default:\n break;\n }\n };\n\n return (\n <>\n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n \n
\n
\n \n );\n}\n\nexport default ExampleComponent;","/src/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n}"},"docsPath":"guides/accessibility/accessibility/react/example2.tsx","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example2","exampleTitle":"Accessible data grid demo","docPermalink":"/accessibility","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__vue__example2.vue.json index 397e910f3..18aa398a8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessibility__accessibility__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessibility · Accessible data grid demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/accessibility/accessibility/vue/example2.vue","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example2","exampleTitle":"Accessible data grid demo","docPermalink":"/accessibility","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessibility · Accessible data grid demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".checkbox-container {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin: 0 -1rem 0 !important;\n padding: 0 1rem 0.75rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\n.checkbox-container > div {\n display: flex;\n}\n\n.checkbox-container > div > label {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.external-link {\n margin-left: 0.5rem;\n position: relative;\n top: 2px;\n color: var(--sl-color-text, #333333);\n}\n\n.external-link:hover {\n color: var(--sl-color-accent, #1A42E8);\n}\n\n.placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.option-label {\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n}\n\n/*\n We want the focus to be around input and label, in order to achieve this,\n we remove focus from the input and add it to the label (wrapper in this case)\n we then use the :focus-within pseudo class plus native focus styles\n https://css-tricks.com/copy-the-browsers-native-focus-styles/\n*/\n.option-label:focus-within {\n outline: 5px auto Highlight;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\n.option-label > input:focus {\n outline: none;\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/accessibility/accessibility/vue/example2.vue","breadcrumb":["Accessibility"],"guide":"guides/accessibility/accessibility/accessibility.md","guideTitle":"Accessibility","exampleId":"example2","exampleTitle":"Accessible data grid demo","docPermalink":"/accessibility","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example1.ts.json index 6995d5795..0c0d24cbe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Column menu · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/column-menu/angular/example1.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Column menu · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/column-menu/angular/example1.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example2.ts.json index fcc59bc92..13f09c33c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n dropdownMenu: [\n 'remove_col',\n '---------',\n 'make_read_only',\n '---------',\n 'alignment',\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/column-menu/angular/example2.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n dropdownMenu: [\n 'remove_col',\n '---------',\n 'make_read_only',\n '---------',\n 'alignment',\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/column-menu/angular/example2.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.js.json index d2c4a4385..2758e5881 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Column menu · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example1.js","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Column menu · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example1.js","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.ts.json index b487ab3d8..83cc075cc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Column menu · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example1.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Column menu · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example1.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.js.json index 09fe98f4b..8a1a11e71 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n dropdownMenu: ['remove_col', '---------', 'make_read_only', '---------', 'alignment'],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example2.js","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n dropdownMenu: ['remove_col', '---------', 'make_read_only', '---------', 'alignment'],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example2.js","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.ts.json index 9a931066d..ad1e6e413 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n dropdownMenu: ['remove_col', '---------', 'make_read_only', '---------', 'alignment'],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example2.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n dropdownMenu: ['remove_col', '---------', 'make_read_only', '---------', 'alignment'],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/column-menu/javascript/example2.ts","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example1.tsx.json index eccaf8241..2abb4d35d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Column menu · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/column-menu/react/example1.tsx","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Column menu · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/column-menu/react/example1.tsx","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example2.tsx.json index a31e579b7..72ffb4882 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/column-menu/react/example2.tsx","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/column-menu/react/example2.tsx","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example1.vue.json index b0e968341..604b38528 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Column menu · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/column-menu/vue/example1.vue","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Column menu · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/column-menu/vue/example1.vue","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example2.vue.json index 1fc5647d2..d454c8ee8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__column-menu__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/column-menu/vue/example2.vue","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Column menu · Plugin configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/column-menu/vue/example2.vue","breadcrumb":["Accessories And Menus","Column menu"],"guide":"guides/accessories-and-menus/column-menu/column-menu.md","guideTitle":"Column menu","exampleId":"example2","exampleTitle":"Plugin configuration","docPermalink":"/column-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example1.ts.json index dee4e345d..714ba449a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example1.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example1.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example2.ts.json index 1ada58333..755cd7afc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example2.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example2.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example3.ts.json index 43f7b73a5..97064f246 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const contextMenuSettings = {\n callback(key: string, selection: any, clickEvent: any) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable): boolean {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below',\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable): boolean {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true,\n isCommand: false,\n },\n },\n };\n\n this.hotSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example3.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const contextMenuSettings = {\n callback(key: string, selection: any, clickEvent: any) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable): boolean {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below',\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable): boolean {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true,\n isCommand: false,\n },\n },\n };\n\n this.hotSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/context-menu/angular/example3.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.js.json index 2aa0a4ea5..5ce4ebf29 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example1.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example1.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.ts.json index deebb6351..163d5dbd8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example1.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example1.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.js.json index f3ff1bb55..0d1b4bcaf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example2.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example2.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.ts.json index 385d196b5..a2101fd2c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example2.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n contextMenu: ['row_above', 'row_below', 'remove_row', 'clear_column'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example2.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.js.json index 6f026fa0e..3becf2865 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key, selection, clickEvent) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled() {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden() {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example3.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key, selection, clickEvent) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled() {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden() {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example3.js","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.ts.json index afc537af7..6e87ce946 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key: string, selection: unknown[], clickEvent?: Event) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable.Core) {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable.Core) {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example3.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key: string, selection: unknown[], clickEvent?: Event) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable.Core) {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable.Core) {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n contextMenu: contextMenuSettings,\n // Required for the HTML in the `about` item's label to be rendered safely\n sanitizer: sanitizeMenuLabel,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/context-menu/javascript/example3.ts","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example1.tsx.json index 245400c29..4bbb3a2ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example1.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example1.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example2.tsx.json index ccf26efa9..4d0c0a1da 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example2.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example2.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example3.tsx.json index b37237941..84085d9d2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key: string, selection: unknown[], clickEvent?: Event) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable.Core) {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable.Core) {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example3.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'I', 'EM', 'STRONG', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeMenuLabel = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst contextMenuSettings = {\n callback(key: string, selection: unknown[], clickEvent?: Event) {\n // Common callback for all options\n console.log(key, selection, clickEvent);\n },\n items: {\n row_above: {\n disabled(this: Handsontable.Core) {\n // `disabled` can be a boolean or a function\n // Disable option when first row was clicked\n return this.getSelectedLast()?.[0] === 0; // `this` === hot\n },\n },\n // Use the dedicated separator constant to insert a separator line\n // (the key has to be unique)\n sp1: ContextMenu.SEPARATOR,\n row_below: {\n name: 'Click to add row below', // Set custom text for predefined option\n },\n about: {\n // Own custom option\n name() {\n // `name` can be a string or a function\n return 'Custom option'; // Name can contain HTML\n },\n hidden(this: Handsontable.Core) {\n // `hidden` can be a boolean or a function\n // Hide the option when the first column was clicked\n return this.getSelectedLast()?.[1] == 0; // `this` === hot\n },\n callback() {\n // Callback for specific option\n setTimeout(() => {\n alert('Hello world!'); // Fire alert after menu close (with timeout)\n }, 0);\n },\n },\n colors: {\n // Own custom option\n name: 'Colors...',\n submenu: {\n // Custom option with submenu of items\n items: [\n {\n // Key must be in the form 'parent_key:child_key'\n key: 'colors:red',\n name: 'Red',\n callback() {\n setTimeout(() => {\n alert('You clicked red!');\n }, 0);\n },\n },\n {\n key: 'colors:green',\n name: 'Green',\n callback() {\n setTimeout(() => {\n alert('You clicked green!');\n }, 0);\n },\n },\n {\n key: 'colors:blue',\n name: 'Blue',\n callback() {\n setTimeout(() => {\n alert('You clicked blue!');\n }, 0);\n },\n },\n ],\n },\n },\n credits: {\n // Own custom property\n // Custom rendered element in the context menu\n renderer() {\n const elem = document.createElement('marquee');\n\n elem.style.cssText = 'background: lightgray; color: #222222;';\n elem.textContent = 'Brought to you by...';\n\n return elem;\n },\n disableSelection: true, // Prevent mouseoever from highlighting the item for selection\n isCommand: false, // Prevent clicks from executing command and closing the menu\n },\n },\n};\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example3.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example4.tsx.json index d1e75ecbb..7accbf2ac 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Context menu with custom options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example4.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example4","exampleTitle":"Context menu with custom options","docPermalink":"/context-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Context menu · Context menu with custom options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { ContextMenu } from 'handsontable/plugins/contextMenu';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/context-menu/react/example4.tsx","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example4","exampleTitle":"Context menu with custom options","docPermalink":"/context-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example1.vue.json index c6fb2228c..4ecbc40ef 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example1.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example1.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/context-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example2.vue.json index 7fdd48caa..516159a28 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example2.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Context menu with selected options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example2.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example2","exampleTitle":"Context menu with selected options","docPermalink":"/context-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example3.vue.json index 8fd670f54..ef3145beb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example3.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Menu item configuration options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example3.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example3","exampleTitle":"Menu item configuration options","docPermalink":"/context-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example4.vue.json index 7bbf99cb7..4659388da 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__context-menu__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Context menu with custom options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example4.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example4","exampleTitle":"Context menu with custom options","docPermalink":"/context-menu","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Context menu · Context menu with custom options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/context-menu/vue/example4.vue","breadcrumb":["Accessories And Menus","Context menu"],"guide":"guides/accessories-and-menus/context-menu/context-menu.md","guideTitle":"Context menu","exampleId":"example4","exampleTitle":"Context menu with custom options","docPermalink":"/context-menu","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example1.ts.json index 1fa225d88..cd665841e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst tableData: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n tableData.push(rowData);\n}\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly hotData = tableData;\n\n readonly hotSettings: GridSettings = {\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport {\n HOT_GLOBAL_CONFIG,\n HotGlobalConfig,\n NON_COMMERCIAL_LICENSE,\n} from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/angular/example1.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst tableData: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n tableData.push(rowData);\n}\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly hotData = tableData;\n\n readonly hotSettings: GridSettings = {\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport {\n HOT_GLOBAL_CONFIG,\n HotGlobalConfig,\n NON_COMMERCIAL_LICENSE,\n} from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/angular/example1.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example2.ts.json index 736a76231..178a24254 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst tableData: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n tableData.push(rowData);\n}\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly hotData = tableData;\n\n intervalMin = 20;\n intervalMax = 500;\n rampDistance = 120;\n\n hotSettings: GridSettings = {\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n // Configurable `interval`/`rampDistance` for `dragToScroll` is not available in 17.1.0, where\n // the option is typed as `boolean`. The cast keeps the example compiling against 17.1.0; at\n // runtime the object is truthy, so drag-to-scroll is enabled (the custom speed is ignored there).\n dragToScroll: {\n interval: { min: this.intervalMin, max: this.intervalMax },\n rampDistance: this.rampDistance,\n } as unknown as GridSettings['dragToScroll'],\n };\n\n onSliderChange(event: Event, field: 'intervalMin' | 'intervalMax' | 'rampDistance'): void {\n this[field] = Number((event.target as HTMLInputElement).value);\n this.sync();\n }\n\n sync(): void {\n this.hotSettings = {\n ...this.hotSettings,\n dragToScroll: {\n interval: { min: this.intervalMin, max: this.intervalMax },\n rampDistance: this.rampDistance,\n } as unknown as GridSettings['dragToScroll'],\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport {\n HOT_GLOBAL_CONFIG,\n HotGlobalConfig,\n NON_COMMERCIAL_LICENSE,\n} from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/angular/example2.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst tableData: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n tableData.push(rowData);\n}\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly hotData = tableData;\n\n intervalMin = 20;\n intervalMax = 500;\n rampDistance = 120;\n\n hotSettings: GridSettings = {\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n // Configurable `interval`/`rampDistance` for `dragToScroll` is not available in 17.1.0, where\n // the option is typed as `boolean`. The cast keeps the example compiling against 17.1.0; at\n // runtime the object is truthy, so drag-to-scroll is enabled (the custom speed is ignored there).\n dragToScroll: {\n interval: { min: this.intervalMin, max: this.intervalMax },\n rampDistance: this.rampDistance,\n } as unknown as GridSettings['dragToScroll'],\n };\n\n onSliderChange(event: Event, field: 'intervalMin' | 'intervalMax' | 'rampDistance'): void {\n this[field] = Number((event.target as HTMLInputElement).value);\n this.sync();\n }\n\n sync(): void {\n this.hotSettings = {\n ...this.hotSettings,\n dragToScroll: {\n interval: { min: this.intervalMin, max: this.intervalMax },\n rampDistance: this.rampDistance,\n } as unknown as GridSettings['dragToScroll'],\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport {\n HOT_GLOBAL_CONFIG,\n HotGlobalConfig,\n NON_COMMERCIAL_LICENSE,\n} from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/angular/example2.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.js.json index 8cdd58b94..5d4cc948b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\nconst container = document.querySelector('#example1');\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n// Build 50 rows of budget data\nconst data = [];\nfor (let row = 0; row < 50; row++) {\n const rowData = [`CC-${1000 + row}`];\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n data.push(rowData);\n}\nnew Handsontable(container, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example1.js","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\nconst container = document.querySelector('#example1');\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n// Build 50 rows of budget data\nconst data = [];\nfor (let row = 0; row < 50; row++) {\n const rowData = [`CC-${1000 + row}`];\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n data.push(rowData);\n}\nnew Handsontable(container, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example1.js","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.ts.json index c5438a5f3..6b39b65a3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nnew Handsontable(container, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example1.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nnew Handsontable(container, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example1.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.js.json index e6a02f5b4..4b5fc4cb5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n// Build 50 rows of budget data\nconst data = [];\nfor (let row = 0; row < 50; row++) {\n const rowData = [`CC-${1000 + row}`];\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n data.push(rowData);\n}\n// Root layout\nconst root = document.querySelector('#example2');\nroot.innerHTML = `\n
\n
\n`;\nfunction addSlider(label, unit, min, max, step, initialValue, onChange) {\n const wrapper = document.createElement('label');\n wrapper.style.cssText = 'display:flex;flex-direction:column;gap:4px;';\n const nameLabel = document.createElement('b');\n nameLabel.style.fontFamily = 'monospace';\n nameLabel.textContent = `${label}: ${initialValue} ${unit}`;\n const input = document.createElement('input');\n input.type = 'range';\n input.min = String(min);\n input.max = String(max);\n input.step = String(step);\n input.value = String(initialValue);\n input.style.cssText = 'width:200px;cursor:pointer;';\n input.addEventListener('input', () => {\n nameLabel.textContent = `${label}: ${input.value} ${unit}`;\n onChange(Number(input.value));\n });\n wrapper.append(nameLabel, input);\n document.getElementById('dts-sliders').appendChild(wrapper);\n}\nlet intervalMin = 20;\nlet intervalMax = 500;\nlet rampDistance = 120;\nconst hot = new Handsontable(document.getElementById('dts-hot'), {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\nfunction sync() {\n hot.updateSettings({\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n });\n}\naddSlider('interval.min', 'ms', 10, 200, 10, intervalMin, (value) => {\n intervalMin = value;\n sync();\n});\naddSlider('interval.max', 'ms', 100, 1000, 50, intervalMax, (value) => {\n intervalMax = value;\n sync();\n});\naddSlider('rampDistance', 'px', 20, 300, 10, rampDistance, (value) => {\n rampDistance = value;\n sync();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example2.js","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n// Build 50 rows of budget data\nconst data = [];\nfor (let row = 0; row < 50; row++) {\n const rowData = [`CC-${1000 + row}`];\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n data.push(rowData);\n}\n// Root layout\nconst root = document.querySelector('#example2');\nroot.innerHTML = `\n
\n
\n`;\nfunction addSlider(label, unit, min, max, step, initialValue, onChange) {\n const wrapper = document.createElement('label');\n wrapper.style.cssText = 'display:flex;flex-direction:column;gap:4px;';\n const nameLabel = document.createElement('b');\n nameLabel.style.fontFamily = 'monospace';\n nameLabel.textContent = `${label}: ${initialValue} ${unit}`;\n const input = document.createElement('input');\n input.type = 'range';\n input.min = String(min);\n input.max = String(max);\n input.step = String(step);\n input.value = String(initialValue);\n input.style.cssText = 'width:200px;cursor:pointer;';\n input.addEventListener('input', () => {\n nameLabel.textContent = `${label}: ${input.value} ${unit}`;\n onChange(Number(input.value));\n });\n wrapper.append(nameLabel, input);\n document.getElementById('dts-sliders').appendChild(wrapper);\n}\nlet intervalMin = 20;\nlet intervalMax = 500;\nlet rampDistance = 120;\nconst hot = new Handsontable(document.getElementById('dts-hot'), {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\nfunction sync() {\n hot.updateSettings({\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n });\n}\naddSlider('interval.min', 'ms', 10, 200, 10, intervalMin, (value) => {\n intervalMin = value;\n sync();\n});\naddSlider('interval.max', 'ms', 100, 1000, 50, intervalMax, (value) => {\n intervalMax = value;\n sync();\n});\naddSlider('rampDistance', 'px', 20, 300, 10, rampDistance, (value) => {\n rampDistance = value;\n sync();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example2.js","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.ts.json index 1db7b5cd0..581e5d3f2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\n// Root layout\nconst root = document.querySelector('#example2') as HTMLElement;\n\nroot.innerHTML = `\n
\n
\n`;\n\nfunction addSlider(\n label: string,\n unit: string,\n min: number,\n max: number,\n step: number,\n initialValue: number,\n onChange: (value: number) => void\n): void {\n const wrapper = document.createElement('label');\n wrapper.style.cssText = 'display:flex;flex-direction:column;gap:4px;';\n\n const nameLabel = document.createElement('b');\n nameLabel.style.fontFamily = 'monospace';\n nameLabel.textContent = `${label}: ${initialValue} ${unit}`;\n\n const input = document.createElement('input');\n input.type = 'range';\n input.min = String(min);\n input.max = String(max);\n input.step = String(step);\n input.value = String(initialValue);\n input.style.cssText = 'width:200px;cursor:pointer;';\n\n input.addEventListener('input', () => {\n nameLabel.textContent = `${label}: ${input.value} ${unit}`;\n onChange(Number(input.value));\n });\n\n wrapper.append(nameLabel, input);\n document.getElementById('dts-sliders')!.appendChild(wrapper);\n}\n\nlet intervalMin = 20;\nlet intervalMax = 500;\nlet rampDistance = 120;\n\nconst hot = new Handsontable(document.getElementById('dts-hot')!, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction sync(): void {\n hot.updateSettings({\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n });\n}\n\naddSlider('interval.min', 'ms', 10, 200, 10, intervalMin, (value) => {\n intervalMin = value;\n sync();\n});\n\naddSlider('interval.max', 'ms', 100, 1000, 50, intervalMax, (value) => {\n intervalMax = value;\n sync();\n});\n\naddSlider('rampDistance', 'px', 20, 300, 10, rampDistance, (value) => {\n rampDistance = value;\n sync();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example2.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\n// Root layout\nconst root = document.querySelector('#example2') as HTMLElement;\n\nroot.innerHTML = `\n
\n
\n`;\n\nfunction addSlider(\n label: string,\n unit: string,\n min: number,\n max: number,\n step: number,\n initialValue: number,\n onChange: (value: number) => void\n): void {\n const wrapper = document.createElement('label');\n wrapper.style.cssText = 'display:flex;flex-direction:column;gap:4px;';\n\n const nameLabel = document.createElement('b');\n nameLabel.style.fontFamily = 'monospace';\n nameLabel.textContent = `${label}: ${initialValue} ${unit}`;\n\n const input = document.createElement('input');\n input.type = 'range';\n input.min = String(min);\n input.max = String(max);\n input.step = String(step);\n input.value = String(initialValue);\n input.style.cssText = 'width:200px;cursor:pointer;';\n\n input.addEventListener('input', () => {\n nameLabel.textContent = `${label}: ${input.value} ${unit}`;\n onChange(Number(input.value));\n });\n\n wrapper.append(nameLabel, input);\n document.getElementById('dts-sliders')!.appendChild(wrapper);\n}\n\nlet intervalMin = 20;\nlet intervalMax = 500;\nlet rampDistance = 120;\n\nconst hot = new Handsontable(document.getElementById('dts-hot')!, {\n data,\n colHeaders,\n width: 500,\n height: 220,\n rowHeaders: true,\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction sync(): void {\n hot.updateSettings({\n dragToScroll: {\n interval: { min: intervalMin, max: intervalMax },\n rampDistance,\n },\n });\n}\n\naddSlider('interval.min', 'ms', 10, 200, 10, intervalMin, (value) => {\n intervalMin = value;\n sync();\n});\n\naddSlider('interval.max', 'ms', 100, 1000, 50, intervalMax, (value) => {\n intervalMax = value;\n sync();\n});\n\naddSlider('rampDistance', 'px', 20, 300, 10, rampDistance, (value) => {\n rampDistance = value;\n sync();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/javascript/example2.ts","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example1.tsx.json index 23cb6a344..f99bb2d6b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/react/example1.tsx","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/react/example1.tsx","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example2.tsx.json index 5144c8321..ca7e0b3e6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nfunction Slider({ label, unit, min, max, step, value, onChange }: {\n label: string; unit: string; min: number; max: number; step: number;\n value: number; onChange: (value: number) => void;\n}) {\n return (\n \n );\n}\n\nconst ExampleComponent = () => {\n const [intervalMin, setIntervalMin] = useState(20);\n const [intervalMax, setIntervalMax] = useState(500);\n const [rampDistance, setRampDistance] = useState(120);\n\n return (\n
\n
\n \n \n \n
\n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/react/example2.tsx","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Build column headers: 'Cost Center' + 49 monthly labels (Jan 2021 … Jan 2025)\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst colHeaders: string[] = ['Cost Center'];\nlet year = 2021;\nlet monthIndex = 0;\n\nwhile (colHeaders.length < 50) {\n colHeaders.push(`${months[monthIndex]} ${year}`);\n monthIndex += 1;\n\n if (monthIndex >= months.length) {\n monthIndex = 0;\n year += 1;\n }\n}\n\n// Build 50 rows of budget data\nconst data: (string | number)[][] = [];\n\nfor (let row = 0; row < 50; row++) {\n const rowData: (string | number)[] = [`CC-${1000 + row}`];\n\n for (let col = 0; col < 49; col++) {\n rowData.push(2000 + row * 100 + col * 50);\n }\n\n data.push(rowData);\n}\n\nfunction Slider({ label, unit, min, max, step, value, onChange }: {\n label: string; unit: string; min: number; max: number; step: number;\n value: number; onChange: (value: number) => void;\n}) {\n return (\n \n );\n}\n\nconst ExampleComponent = () => {\n const [intervalMin, setIntervalMin] = useState(20);\n const [intervalMax, setIntervalMax] = useState(500);\n const [rampDistance, setRampDistance] = useState(120);\n\n return (\n
\n
\n \n \n \n
\n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/react/example2.tsx","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example1.vue.json index 2b74a2e74..4d92059f2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/vue/example1.vue","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Drag to scroll · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/vue/example1.vue","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/drag-to-scroll","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example2.vue.json index 16ae10239..7bcb709da 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__drag-to-scroll__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/vue/example2.vue","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Drag to scroll · Configure scroll speed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/drag-to-scroll/vue/example2.vue","breadcrumb":["Accessories And Menus","Drag to scroll"],"guide":"guides/accessories-and-menus/drag-to-scroll/drag-to-scroll.md","guideTitle":"Drag to scroll","exampleId":"example2","exampleTitle":"Configure scroll speed","docPermalink":"/drag-to-scroll","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example1.ts.json index 400f13e4b..65fe62675 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true, // Enable empty data state with default settings\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example1.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true, // Enable empty data state with default settings\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example1.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example2.ts.json index bb2d61c10..41adaccf0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n this.hotTable.hotInstance!.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n }\n }\n ]\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example2.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n this.hotTable.hotInstance!.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n }\n }\n ]\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example2.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example3.ts.json index 9e4fc5ac0..1f5d672bb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source: string) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = this.hotTable.hotInstance!.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n }\n }\n ]\n };\n default:\n return {\n title: 'No data available',\n description: 'There\\'s nothing to display yet. Add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n this.hotTable.hotInstance!.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n }\n }\n ]\n };\n }\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example3.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n readonly hotData = [];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source: string) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = this.hotTable.hotInstance!.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n }\n }\n ]\n };\n default:\n return {\n title: 'No data available',\n description: 'There\\'s nothing to display yet. Add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n this.hotTable.hotInstance!.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n }\n }\n ]\n };\n }\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/empty-data-state/angular/example3.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.js.json index e16d57c62..dbead794d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable';\n\nconst container = document.getElementById('example1');\n\nnew Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example1.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable';\n\nconst container = document.getElementById('example1');\n\nnew Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example1.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.ts.json index 077a854f8..4494f5c11 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable';\n\nconst container = document.getElementById('example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true, // Enable empty data state with default settings\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example1.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable';\n\nconst container = document.getElementById('example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: true, // Enable empty data state with default settings\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example1.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.js.json index 83f53cd4f..04e77476f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// Custom configuration example for Empty Data State plugin\n// This example shows how to customize the empty data state message\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example2');\n\nconst hot = new Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example2.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// Custom configuration example for Empty Data State plugin\n// This example shows how to customize the empty data state message\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example2');\n\nconst hot = new Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example2.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.ts.json index 8711e11e5..bbbee61b8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// Custom configuration example for Empty Data State plugin\n// This example shows how to customize the empty data state message\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example2') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example2.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// Custom configuration example for Empty Data State plugin\n// This example shows how to customize the empty data state message\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example2') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n data: [], // Empty data to trigger empty state\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n emptyDataState: {\n message: {\n title: 'No data available',\n description: 'Please add some data to get started.',\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example2.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.js.json index 1c0f77011..a85b40aa0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// Dynamic messages based on source example for Empty Data State plugin\n// This example shows how to provide different messages based on the source of empty state\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example3');\n\nconst hot = new Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hot.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example3.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// Dynamic messages based on source example for Empty Data State plugin\n// This example shows how to provide different messages based on the source of empty state\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example3');\n\nconst hot = new Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hot.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example3.js","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.ts.json index 920fa2745..8593c8908 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// Dynamic messages based on source example for Empty Data State plugin\n// This example shows how to provide different messages based on the source of empty state\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example3') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source: string) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hot.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example3.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// Dynamic messages based on source example for Empty Data State plugin\n// This example shows how to provide different messages based on the source of empty state\n\nimport Handsontable from 'handsontable';\n\nconst container = document.getElementById('example3') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n data: [],\n height: 'auto',\n colHeaders: ['Name', 'Job title', 'Department', 'City'],\n rowHeaders: true,\n navigableHeaders: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: {\n message: (source: string) => {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hot.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hot.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/empty-data-state/javascript/example3.ts","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example1.tsx.json index 4deef68be..c577a5821 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example1.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example1.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example2.tsx.json index 59b9c53ad..739219b87 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n {\n hotTableRef.current?.hotInstance.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example2.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n {\n hotTableRef.current?.hotInstance.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example2.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example3.tsx.json index 909f23d3c..185fed25a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hotTableRef.current?.hotInstance.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hotTableRef.current?.hotInstance.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example3.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n\n return (\n {\n switch (source) {\n case 'filters':\n return {\n title: 'No results found',\n description: 'Your current filters are hiding all results. Try adjusting your search criteria.',\n buttons: [\n {\n text: 'Clear Filters',\n type: 'secondary',\n callback: () => {\n const filtersPlugin = hotTableRef.current?.hotInstance.getPlugin('filters');\n\n if (filtersPlugin) {\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n }\n },\n },\n ],\n };\n default:\n return {\n title: 'No data available',\n description: \"There's nothing to display yet. Add some data to get started.\",\n buttons: [\n {\n text: 'Load employees',\n type: 'primary',\n callback: () => {\n hotTableRef.current?.hotInstance.loadData([\n ['Ana García', 'Senior Engineer', 'Engineering', 'Austin'],\n ['James Okafor', 'Product Manager', 'Product', 'Chicago'],\n ['Li Wei', 'Data Analyst', 'Analytics', 'Seattle'],\n ['Priya Raman', 'Marketing Lead', 'Marketing', 'Denver'],\n ['Marcus Johnson', 'HR Business Partner', 'People Operations', 'Atlanta'],\n ]);\n },\n },\n ],\n };\n }\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/empty-data-state/react/example3.tsx","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example1.vue.json index ac67b49c4..3c651ee95 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example1.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example1.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/empty-data-state","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example2.vue.json index 7aec13a35..2f802f24e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example2.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Custom configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example2.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/empty-data-state","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example3.vue.json index 3e0866e82..85e2f7a43 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__empty-data-state__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example3.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Empty data state · Dynamic messages based on source · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/empty-data-state/vue/example3.vue","breadcrumb":["Accessories And Menus","Empty data state"],"guide":"guides/accessories-and-menus/empty-data-state/empty-data-state.md","guideTitle":"Empty data state","exampleId":"example3","exampleTitle":"Dynamic messages based on source","docPermalink":"/empty-data-state","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example1.ts.json index 1e3c852e5..566edc9de 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n exportFile() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example1.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n exportFile() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example1.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example2.ts.json index 65501685b..3749383a3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
\n
\n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n // Hidden rows and columns stay out of both exports.\n private readonly exportOptions = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n };\n\n exportBlob() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n console.log(exportPlugin.exportAsBlob('csv', this.exportOptions));\n }\n\n exportString() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n console.log(exportPlugin.exportAsString('csv', this.exportOptions));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example2.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
\n
\n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n // Hidden rows and columns stay out of both exports.\n private readonly exportOptions = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n };\n\n exportBlob() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n console.log(exportPlugin.exportAsBlob('csv', this.exportOptions));\n }\n\n exportString() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n console.log(exportPlugin.exportAsString('csv', this.exportOptions));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example2.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example3.ts.json index 7dde8cdcb..33dbd26dc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n \n
\n
\n\n \n \n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n downloadCSVWithNoSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n }\n\n downloadCSVWithRecommendedSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n }\n\n downloadCSVWithRegexpSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n }\n\n downloadCSVWithFunctionSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value: string) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example3.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n \n
\n
\n\n \n \n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n downloadCSVWithNoSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n }\n\n downloadCSVWithRecommendedSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n }\n\n downloadCSVWithRegexpSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n }\n\n downloadCSVWithFunctionSanitization() {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value: string) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-csv/angular/example3.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.js.json index a447ce713..ee093756f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\nconst button = document.querySelector('#export-file');\n\nbutton.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example1.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\nconst button = document.querySelector('#export-file');\n\nbutton.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example1.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.ts.json index 4d62a7ccb..348903f02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\nconst button = document.querySelector('#export-file')!;\n\nbutton.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example1.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\nconst button = document.querySelector('#export-file')!;\n\nbutton.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example1.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.js.json index c5779b598..eaa7b56d6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\ndocument.querySelector('#export-blob').addEventListener('click', () => {\n console.log(exportPlugin.exportAsBlob('csv', options));\n});\n\ndocument.querySelector('#export-string').addEventListener('click', () => {\n console.log(exportPlugin.exportAsString('csv', options));\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example2.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\ndocument.querySelector('#export-blob').addEventListener('click', () => {\n console.log(exportPlugin.exportAsBlob('csv', options));\n});\n\ndocument.querySelector('#export-string').addEventListener('click', () => {\n console.log(exportPlugin.exportAsString('csv', options));\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example2.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.ts.json index 2c5f1a5fe..abaaf6e36 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\ndocument.querySelector('#export-blob')!.addEventListener('click', () => {\n console.log(exportPlugin.exportAsBlob('csv', options));\n});\n\ndocument.querySelector('#export-string')!.addEventListener('click', () => {\n console.log(exportPlugin.exportAsString('csv', options));\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example2.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n ],\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: { rows: [1, 3, 5], indicators: true },\n hiddenColumns: { columns: [1, 3, 5], indicators: true },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\ndocument.querySelector('#export-blob')!.addEventListener('click', () => {\n console.log(exportPlugin.exportAsBlob('csv', options));\n});\n\ndocument.querySelector('#export-string')!.addEventListener('click', () => {\n console.log(exportPlugin.exportAsString('csv', options));\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example2.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.js.json index 1898d1577..39e2fd2ad 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nconst hot = new Handsontable(container, {\n data: [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\ndocument.querySelector('#no-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n});\n\ndocument.querySelector('#recommended-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n});\n\ndocument.querySelector('#regexp-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n});\n\ndocument.querySelector('#function-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example3.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nconst hot = new Handsontable(container, {\n data: [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin = hot.getPlugin('exportFile');\n\ndocument.querySelector('#no-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n});\n\ndocument.querySelector('#recommended-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n});\n\ndocument.querySelector('#regexp-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n});\n\ndocument.querySelector('#function-sanitization').addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example3.js","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.ts.json index 66c8b2e86..2451f4732 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\ndocument.querySelector('#no-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n});\n\ndocument.querySelector('#recommended-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n});\n\ndocument.querySelector('#regexp-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n});\n\ndocument.querySelector('#function-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example3.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { ExportFile } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst exportPlugin: ExportFile = hot.getPlugin('exportFile');\n\ndocument.querySelector('#no-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n});\n\ndocument.querySelector('#recommended-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n});\n\ndocument.querySelector('#regexp-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n});\n\ndocument.querySelector('#function-sanitization')!.addEventListener('click', () => {\n exportPlugin.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-csv/javascript/example3.ts","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example1.tsx.json index ddd0966b3..0721762b8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const buttonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example1.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const buttonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n filename: 'Campaigns_[YYYY]-[MM]-[DD]',\n });\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example1.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example2.tsx.json index 176fd9049..988c0760d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n];\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const exportBlob = () => {\n const exportPlugin = hotRef.current?.hotInstance?.getPlugin('exportFile');\n\n console.log(exportPlugin?.exportAsBlob('csv', options));\n };\n\n const exportString = () => {\n const exportPlugin = hotRef.current?.hotInstance?.getPlugin('exportFile');\n\n console.log(exportPlugin?.exportAsString('csv', options));\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example2.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Launch', 'Email', 'North America', '1240', '4.2%', '$12000', 'Q1 2025'],\n ['Partner Webinar', 'Paid Search', 'EMEA', '860', '6.1%', '$9400', 'Q1 2025'],\n ['Summer Upsell', 'Social', 'APAC', '1520', '3.7%', '$13800', 'Q2 2025'],\n ['Product Video', 'Email', 'North America', '980', '5.4%', '$8600', 'Q2 2025'],\n ['Back-to-School', 'Display', 'LATAM', '1110', '4.8%', '$10100', 'Q3 2025'],\n ['Holiday Teaser', 'Affiliate', 'EMEA', '1340', '5.9%', '$12700', 'Q4 2025'],\n ['Loyalty Drive', 'SMS', 'APAC', '790', '7.3%', '$6200', 'Q4 2025'],\n];\n\n// Hidden rows and columns stay out of both exports.\nconst options = {\n colHeaders: true,\n rowHeaders: true,\n exportHiddenColumns: false,\n exportHiddenRows: false,\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const exportBlob = () => {\n const exportPlugin = hotRef.current?.hotInstance?.getPlugin('exportFile');\n\n console.log(exportPlugin?.exportAsBlob('csv', options));\n };\n\n const exportString = () => {\n const exportPlugin = hotRef.current?.hotInstance?.getPlugin('exportFile');\n\n console.log(exportPlugin?.exportAsString('csv', options));\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example2.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example3.tsx.json index 93fe00b82..8e737fa48 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const downloadWithNoSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n };\n\n const downloadWithRecommendedSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n };\n\n const downloadWithRegexpSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n };\n\n const downloadWithFunctionSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n };\n\n return (\n <>\n
\n
\n \n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example3.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['https://api.acme-inventory.com/live-stock', '=WEBSERVICE(\"https://api.acme-inventory.com/live-stock\")'],\n ['https://status.vertex-logistics.com/feed', '=WEBSERVICE(\"https://status.vertex-logistics.com/feed\")'],\n ['http://malicious.example/payload.exe', '=CMD(\"| calc.exe\")'],\n ['https://news.example.com/q2-briefing', '=HYPERLINK(\"http://malicious.example\",\"Open report\")'],\n ['https://cdn.example.com/daily.csv', '+SUM(1,1)'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const downloadWithNoSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n });\n };\n\n const downloadWithRecommendedSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: true,\n });\n };\n\n const downloadWithRegexpSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: /WEBSERVICE|CMD|HYPERLINK|^\\+/,\n });\n };\n\n const downloadWithFunctionSanitizationCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n exportPlugin?.downloadFile('csv', {\n bom: false,\n columnDelimiter: ',',\n colHeaders: false,\n exportHiddenColumns: true,\n exportHiddenRows: true,\n fileExtension: 'csv',\n filename: 'Handsontable-CSV-file_[YYYY]-[MM]-[DD]',\n mimeType: 'text/csv',\n rowDelimiter: '\\r\\n',\n sanitizeValues: (value) => {\n return /WEBSERVICE|CMD|HYPERLINK|^\\+/.test(value) ? 'REMOVED SUSPICIOUS CELL CONTENT' : value;\n },\n });\n };\n\n return (\n <>\n
\n
\n \n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-csv/react/example3.tsx","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example1.vue.json index 02eac12c7..f1f896a62 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example1.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example1.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-csv","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example2.vue.json index fb601de22..df227c361 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example2.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · 2. Export as a Blob or a string · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example2.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example2","exampleTitle":"2. Export as a Blob or a string","docPermalink":"/export-to-csv","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example3.vue.json index 76eb731d2..07f036ee0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-csv__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example3.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to CSV · 3. Prevent CSV injection · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-csv/vue/example3.vue","breadcrumb":["Accessories And Menus","Export to CSV"],"guide":"guides/accessories-and-menus/export-to-csv/export-to-csv.md","guideTitle":"Export to CSV","exampleId":"example3","exampleTitle":"3. Prevent CSV injection","docPermalink":"/export-to-csv","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example1.ts.json index 809294dce..ac7395523 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ];\n\n readonly hotSettings: GridSettings = {\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [{ row: 5, col: 0, rowspan: 1, colspan: 2 }],\n customBorders: [{ row: 5, col: 2, top: { width: 2, color: '#333333' } }],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n afterInit(this: Handsontable) {\n this.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\n this.render();\n },\n };\n\n async exportFile(): Promise {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example1.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ];\n\n readonly hotSettings: GridSettings = {\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [{ row: 5, col: 0, rowspan: 1, colspan: 2 }],\n customBorders: [{ row: 5, col: 2, top: { width: 2, color: '#333333' } }],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n afterInit(this: Handsontable) {\n this.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\n this.render();\n },\n };\n\n async exportFile(): Promise {\n const exportPlugin = this.hotTable.hotInstance!.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example1.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example2.ts.json index 859eaa940..1728e988e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
\n
\n \n
\n
\n\n

Q1 Sales

\n \n\n

Q2 Sales

\n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotQ2', { static: false }) hotQ2!: HotTableComponent;\n @ViewChild(HotTableComponent, { static: false }) hotQ1!: HotTableComponent;\n\n readonly q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n ];\n\n readonly q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n ];\n\n readonly sharedSettings: GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n };\n\n async exportSheets(): Promise {\n const hotQ1 = this.hotQ1.hotInstance!;\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: this.hotQ2.hotInstance!, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example2.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
\n
\n \n
\n
\n\n

Q1 Sales

\n \n\n

Q2 Sales

\n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotQ2', { static: false }) hotQ2!: HotTableComponent;\n @ViewChild(HotTableComponent, { static: false }) hotQ1!: HotTableComponent;\n\n readonly q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n ];\n\n readonly q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n ];\n\n readonly sharedSettings: GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n };\n\n async exportSheets(): Promise {\n const hotQ1 = this.hotQ1.hotInstance!;\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: this.hotQ2.hotInstance!, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example2.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example3.ts.json index 76c72bf3b..2db33a95d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n

Right-click any cell to open the context menu.

\n
\n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1', 'Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example3.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n

Right-click any cell to open the context menu.

\n
\n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1', 'Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/export-to-excel/angular/example3.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.js.json index 34c03bc28..640a1cd20 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ],\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [{ row: 5, col: 0, rowspan: 1, colspan: 2 }],\n customBorders: [\n {\n row: 5,\n col: 2,\n top: { width: 2, color: '#333333' },\n },\n ],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Add a comment to Alice's notes cell.\nhot.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\nhot.render();\n\nconst exportPlugin = hot.getPlugin('exportFile');\nconst button = document.querySelector('#export-file');\n\nbutton.addEventListener('click', async () => {\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example1.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ],\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [{ row: 5, col: 0, rowspan: 1, colspan: 2 }],\n customBorders: [\n {\n row: 5,\n col: 2,\n top: { width: 2, color: '#333333' },\n },\n ],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Add a comment to Alice's notes cell.\nhot.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\nhot.render();\n\nconst exportPlugin = hot.getPlugin('exportFile');\nconst button = document.querySelector('#export-file');\n\nbutton.addEventListener('click', async () => {\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example1.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.ts.json index 291fbe3f6..6c8c1208b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ],\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [\n { row: 5, col: 0, rowspan: 1, colspan: 2 },\n ],\n customBorders: [\n {\n row: 5, col: 2,\n top: { width: 2, color: '#333333' },\n },\n ],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Add a comment to Alice's notes cell.\nhot.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\nhot.render();\n\nconst exportPlugin = hot.getPlugin('exportFile');\nconst button = document.querySelector('#export-file')!;\n\nbutton.addEventListener('click', async () => {\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example1.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n ],\n nestedHeaders: [\n [\n { label: 'Sales Representative', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Results', colspan: 2, headerClassName: 'htCenter' },\n { label: 'Notes', colspan: 1, headerClassName: 'htLeft' },\n ],\n ['Name', 'Region', 'Revenue ($)', 'Hit Target?', 'Notes'],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n { type: 'text' },\n ],\n columnSummary: [\n {\n sourceColumn: 2,\n destinationRow: 5,\n destinationColumn: 2,\n type: 'sum',\n forceNumeric: true,\n },\n ],\n mergeCells: [\n { row: 5, col: 0, rowspan: 1, colspan: 2 },\n ],\n customBorders: [\n {\n row: 5, col: 2,\n top: { width: 2, color: '#333333' },\n },\n ],\n cell: [\n { row: 5, col: 0, readOnly: true },\n { row: 5, col: 2, readOnly: true },\n ],\n fixedColumnsStart: 1,\n rowHeaders: true,\n comments: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Add a comment to Alice's notes cell.\nhot.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\nhot.render();\n\nconst exportPlugin = hot.getPlugin('exportFile');\nconst button = document.querySelector('#export-file')!;\n\nbutton.addEventListener('click', async () => {\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example1.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.js.json index a4c672635..47a43e33e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n

Q1 Sales

\n
\n

Q2 Sales

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true],\n ['Bob Chen', 'East', 98500, true],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true],\n ['Bob Chen', 'East', 112400, true],\n ['Carol Davies', 'South', 89100, true],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true],\n];\n\nconst sharedConfig = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hotQ1 = new Handsontable(document.querySelector('#example2-q1'), {\n ...sharedConfig,\n data: q1Data,\n});\n\nconst hotQ2 = new Handsontable(document.querySelector('#example2-q2'), {\n ...sharedConfig,\n data: q2Data,\n});\n\ndocument.querySelector('#export-sheets').addEventListener('click', async () => {\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example2.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n

Q1 Sales

\n
\n

Q2 Sales

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true],\n ['Bob Chen', 'East', 98500, true],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true],\n ['Bob Chen', 'East', 112400, true],\n ['Carol Davies', 'South', 89100, true],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true],\n];\n\nconst sharedConfig = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hotQ1 = new Handsontable(document.querySelector('#example2-q1'), {\n ...sharedConfig,\n data: q1Data,\n});\n\nconst hotQ2 = new Handsontable(document.querySelector('#example2-q2'), {\n ...sharedConfig,\n data: q2Data,\n});\n\ndocument.querySelector('#export-sheets').addEventListener('click', async () => {\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example2.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.ts.json index e002acc6e..5737f0435 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n

Q1 Sales

\n
\n

Q2 Sales

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n];\n\nconst sharedConfig: Handsontable.GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hotQ1 = new Handsontable(document.querySelector('#example2-q1')!, {\n ...sharedConfig,\n data: q1Data,\n});\n\nconst hotQ2 = new Handsontable(document.querySelector('#example2-q2')!, {\n ...sharedConfig,\n data: q2Data,\n});\n\ndocument.querySelector('#export-sheets')!.addEventListener('click', async () => {\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example2.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n

Q1 Sales

\n
\n

Q2 Sales

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n];\n\nconst sharedConfig: Handsontable.GridSettings = {\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' },\n ],\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hotQ1 = new Handsontable(document.querySelector('#example2-q1')!, {\n ...sharedConfig,\n data: q1Data,\n});\n\nconst hotQ2 = new Handsontable(document.querySelector('#example2-q2')!, {\n ...sharedConfig,\n data: q2Data,\n});\n\ndocument.querySelector('#export-sheets')!.addEventListener('click', async () => {\n const exportPlugin = hotQ1.getPlugin('exportFile');\n\n await exportPlugin.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example2.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.js.json index d7be8995e..54d660aa1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Right-click any cell to open the context menu.

\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\nnew Handsontable(document.querySelector('#example3'), {\n data: [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1','Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example3.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Right-click any cell to open the context menu.

\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\nnew Handsontable(document.querySelector('#example3'), {\n data: [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1','Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example3.js","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.ts.json index c753e0b61..5a9725008 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Right-click any cell to open the context menu.

\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nnew Handsontable(document.querySelector('#example3')!, {\n data: [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1','Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example3.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Right-click any cell to open the context menu.

\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nnew Handsontable(document.querySelector('#example3')!, {\n data: [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1','Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n ],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Electronics', 'Accessories', 'Software'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'numeric' },\n { type: 'checkbox' },\n ],\n colHeaders: ['Product', 'Category', 'Unit Price', 'Stock', 'Active?'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n contextMenu: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/export-to-excel/javascript/example3.ts","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example1.tsx.json index 3a6b32031..5176e5e2e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst hotData = [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const handleAfterInit = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\n hot?.render();\n };\n\n const exportFile = async () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n await exportPlugin?.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example1.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst hotData = [\n ['Alice Martin', 'North', 142000, true, 'Exceeded Q1 target by 18%.'],\n ['Bob Chen', 'East', 98500, true, 'Strong pipeline for Q2.'],\n ['Carol Davies', 'South', 76200, false, 'Needs coaching on closing.'],\n ['David Kim', 'West', 115300, true, 'Cross-sell opportunity.'],\n ['Eva Rossi', 'North', 54800, false, 'Sick leave impacted March.'],\n ['TOTALS', '', null, '', ''],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const handleAfterInit = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.setCellMeta(0, 4, 'comment', { value: 'Top sales rep - review for promotion.' });\n hot?.render();\n };\n\n const exportFile = async () => {\n const hot = hotRef.current?.hotInstance;\n const exportPlugin = hot?.getPlugin('exportFile');\n\n await exportPlugin?.downloadFileAsync('xlsx', {\n filename: 'Q1-Sales-Report',\n colHeaders: true,\n rowHeaders: true,\n exportFormulas: true,\n });\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example1.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example2.tsx.json index 38ca21edf..bac586ac6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n];\n\nconst columns = [\n { type: 'text' as const },\n { type: 'dropdown' as const, source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric' as const,\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' as const },\n];\n\nconst ExampleComponent = () => {\n const hotQ1Ref = useRef(null);\n const hotQ2Ref = useRef(null);\n\n const exportSheets = async () => {\n const hotQ1 = hotQ1Ref.current?.hotInstance;\n const exportPlugin = hotQ1?.getPlugin('exportFile');\n\n await exportPlugin?.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1!, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2Ref.current?.hotInstance!, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n };\n\n const sharedProps = {\n columns,\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto' as const,\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation' as const,\n };\n\n return (\n <>\n
\n
\n \n
\n
\n

Q1 Sales

\n \n

Q2 Sales

\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example2.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst q1Data = [\n ['Alice Martin', 'North', 142000, true ],\n ['Bob Chen', 'East', 98500, true ],\n ['Carol Davies', 'South', 76200, false],\n ['David Kim', 'West', 115300, true ],\n ['Eva Rossi', 'North', 54800, false],\n];\n\nconst q2Data = [\n ['Alice Martin', 'North', 158000, true ],\n ['Bob Chen', 'East', 112400, true ],\n ['Carol Davies', 'South', 89100, true ],\n ['David Kim', 'West', 97600, false],\n ['Eva Rossi', 'North', 63200, true ],\n];\n\nconst columns = [\n { type: 'text' as const },\n { type: 'dropdown' as const, source: ['North', 'South', 'East', 'West'] },\n {\n type: 'numeric' as const,\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n { type: 'checkbox' as const },\n];\n\nconst ExampleComponent = () => {\n const hotQ1Ref = useRef(null);\n const hotQ2Ref = useRef(null);\n\n const exportSheets = async () => {\n const hotQ1 = hotQ1Ref.current?.hotInstance;\n const exportPlugin = hotQ1?.getPlugin('exportFile');\n\n await exportPlugin?.downloadFileAsync('xlsx', {\n filename: 'Annual-Sales-Report',\n sheets: [\n { instance: hotQ1!, name: 'Q1 Sales', colHeaders: true, rowHeaders: true },\n { instance: hotQ2Ref.current?.hotInstance!, name: 'Q2 Sales', colHeaders: true, rowHeaders: true },\n ],\n });\n };\n\n const sharedProps = {\n columns,\n colHeaders: ['Name', 'Region', 'Revenue ($)', 'Hit Target?'],\n rowHeaders: true,\n height: 'auto' as const,\n autoWrapRow: true,\n autoWrapCol: true,\n exportFile: true,\n licenseKey: 'non-commercial-and-evaluation' as const,\n };\n\n return (\n <>\n
\n
\n \n
\n
\n

Q1 Sales

\n \n

Q2 Sales

\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example2.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example3.tsx.json index 08f94dcfe..22a5306c8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst hotData = [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1', 'Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n];\n\nconst ExampleComponent = () => (\n <>\n
\n

Right-click any cell to open the context menu.

\n
\n \n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example3.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst hotData = [\n ['Laptop Pro 15\"', 'Electronics', 1299.99, 38, true ],\n ['Wireless Mouse', 'Accessories', 29.99, 214, true ],\n ['USB-C Hub 7-in-1', 'Accessories', 49.99, 87, true ],\n ['Monitor 27\" 4K', 'Electronics', 449.99, 12, false],\n ['Mech Keyboard', 'Accessories', 119.99, 65, true ],\n];\n\nconst ExampleComponent = () => (\n <>\n
\n

Right-click any cell to open the context menu.

\n
\n \n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/export-to-excel/react/example3.tsx","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example1.vue.json index e82c77ec1..099d51b35 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example1.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example1.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/export-to-excel","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example2.vue.json index 74a8a4fca..625049d3a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example2.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Multi-sheet export · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example2.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example2","exampleTitle":"Multi-sheet export","docPermalink":"/export-to-excel","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example3.vue.json index ebf26c5f9..f7b03b870 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__export-to-excel__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example3.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Export to Excel · Context menu · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/export-to-excel/vue/example3.vue","breadcrumb":["Accessories And Menus","Export to Excel"],"guide":"guides/accessories-and-menus/export-to-excel/export-to-excel.md","guideTitle":"Export to Excel","exampleId":"example3","exampleTitle":"Context menu","docPermalink":"/export-to-excel","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__angular__example1.ts.json index bc9352c3f..eeaa5d233 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, NgZone, ViewChild, inject, signal } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n \n \n {{ status() }}\n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n private readonly zone = inject(NgZone);\n private readonly sampleUrl = '/docs/scripts/xlsx/employees.xlsx';\n\n // A signal, not a plain field: the import runs outside the Angular zone (see below), so nothing\n // else schedules a change detection run when the status changes.\n readonly status = signal('');\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ];\n\n // One stable object that nothing replaces. The wrapper passes every key of a new `[settings]`\n // object to `updateSettings`, so a settings object you bind after an import must leave out\n // `colHeaders` and `columns`, or the sample headers and column types replace the imported ones.\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n };\n\n loadSample(): void {\n this.zone.runOutsideAngular(async() => {\n const response = await fetch(this.sampleUrl);\n\n await this.importWorkbook(await response.blob(), 'employees.xlsx');\n });\n }\n\n importFile(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n\n this.zone.runOutsideAngular(async() => {\n if (file) {\n await this.importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n input.value = '';\n });\n }\n\n // The built-in engine awaits once per archive slice, and each await would end a Zone.js turn\n // and run change detection, so the import runs outside the zone.\n private async importWorkbook(blob: Blob, name: string): Promise {\n const importPlugin = this.hotTable?.hotInstance?.getPlugin('importFile');\n\n if (!importPlugin) {\n this.status.set('The grid is not ready.');\n\n return;\n }\n\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n this.status.set(`Imported ${name}`);\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n this.status.set((error as Error).message);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/import-from-excel/angular/example1.ts","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, NgZone, ViewChild, inject, signal } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
\n
\n \n \n \n {{ status() }}\n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n private readonly zone = inject(NgZone);\n private readonly sampleUrl = '/docs/scripts/xlsx/employees.xlsx';\n\n // A signal, not a plain field: the import runs outside the Angular zone (see below), so nothing\n // else schedules a change detection run when the status changes.\n readonly status = signal('');\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ];\n\n // One stable object that nothing replaces. The wrapper passes every key of a new `[settings]`\n // object to `updateSettings`, so a settings object you bind after an import must leave out\n // `colHeaders` and `columns`, or the sample headers and column types replace the imported ones.\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n };\n\n loadSample(): void {\n this.zone.runOutsideAngular(async() => {\n const response = await fetch(this.sampleUrl);\n\n await this.importWorkbook(await response.blob(), 'employees.xlsx');\n });\n }\n\n importFile(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n\n this.zone.runOutsideAngular(async() => {\n if (file) {\n await this.importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n input.value = '';\n });\n }\n\n // The built-in engine awaits once per archive slice, and each await would end a Zone.js turn\n // and run change detection, so the import runs outside the zone.\n private async importWorkbook(blob: Blob, name: string): Promise {\n const importPlugin = this.hotTable?.hotInstance?.getPlugin('importFile');\n\n if (!importPlugin) {\n this.status.set('The grid is not ready.');\n\n return;\n }\n\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n this.status.set(`Imported ${name}`);\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n this.status.set((error as Error).message);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/import-from-excel/angular/example1.ts","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.js.json index 3a9948cec..d09e9c920 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ],\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst importPlugin = hot.getPlugin('importFile');\nconst status = document.querySelector('#import-status');\nconst fileInput = document.querySelector('#import-file');\n\nasync function importWorkbook(blob, name) {\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n status.textContent = `Imported ${name}`;\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n status.textContent = error.message;\n }\n}\n\ndocument.querySelector('#load-sample').addEventListener('click', async () => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n});\n\nfileInput.addEventListener('change', async () => {\n const file = fileInput.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n fileInput.value = '';\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/import-from-excel/javascript/example1.js","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ],\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst importPlugin = hot.getPlugin('importFile');\nconst status = document.querySelector('#import-status');\nconst fileInput = document.querySelector('#import-file');\n\nasync function importWorkbook(blob, name) {\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n status.textContent = `Imported ${name}`;\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n status.textContent = error.message;\n }\n}\n\ndocument.querySelector('#load-sample').addEventListener('click', async () => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n});\n\nfileInput.addEventListener('change', async () => {\n const file = fileInput.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n fileInput.value = '';\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/import-from-excel/javascript/example1.js","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.ts.json index 2aa783a0b..c72b24f5e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ],\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst importPlugin = hot.getPlugin('importFile');\nconst status = document.querySelector('#import-status')!;\nconst fileInput = document.querySelector('#import-file')!;\n\nasync function importWorkbook(blob: Blob, name: string): Promise {\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n status.textContent = `Imported ${name}`;\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n status.textContent = (error as Error).message;\n }\n}\n\ndocument.querySelector('#load-sample')!.addEventListener('click', async() => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n});\n\nfileInput.addEventListener('change', async() => {\n const file = fileInput.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n fileInput.value = '';\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/import-from-excel/javascript/example1.ts","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n ],\n colHeaders: ['Name', 'Department', 'Job title', 'Salary ($)', 'Active', 'Hire date'],\n columns: [\n { type: 'text' },\n { type: 'dropdown', source: ['Engineering', 'Marketing', 'Sales', 'Support'] },\n { type: 'text' },\n { type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n { type: 'checkbox' },\n { type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n ],\n rowHeaders: true,\n formulas: { engine: HyperFormula },\n comments: true,\n mergeCells: true,\n hiddenColumns: true,\n customBorders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst importPlugin = hot.getPlugin('importFile');\nconst status = document.querySelector('#import-status')!;\nconst fileInput = document.querySelector('#import-file')!;\n\nasync function importWorkbook(blob: Blob, name: string): Promise {\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n status.textContent = `Imported ${name}`;\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n status.textContent = (error as Error).message;\n }\n}\n\ndocument.querySelector('#load-sample')!.addEventListener('click', async() => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n});\n\nfileInput.addEventListener('change', async() => {\n const file = fileInput.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared either way, so picking the same file again fires `change` again.\n fileInput.value = '';\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/import-from-excel/javascript/example1.ts","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__react__example1.tsx.json index 659436203..38bc3e133 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { RefObject, useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n];\n\n// The controls and their status live in their own component. A re-render of the component that\n// renders `HotTable` makes the wrapper send `data` and `colHeaders` to `updateSettings` again,\n// which replaces the imported sheet with the sample rows. A grid fed by a server prop must keep\n// its first value, for example with `const [firstRows] = useState(rows);`.\nconst ImportControls = ({ hotRef }: { hotRef: RefObject }) => {\n const [status, setStatus] = useState('');\n\n const importWorkbook = async (blob: Blob, name: string) => {\n const importPlugin = hotRef.current?.hotInstance?.getPlugin('importFile');\n\n if (!importPlugin) {\n // No grid is mounted, for example while it sits in a hidden tab.\n setStatus('The grid is not ready.');\n\n return;\n }\n\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n setStatus(`Imported ${name}`);\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n setStatus((error as Error).message);\n }\n };\n\n const loadSample = async () => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n };\n\n const importFile = async (event: React.ChangeEvent) => {\n const file = event.target.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared on every path, so picking the same file again fires `change` again. No `finally`:\n // React Compiler does not compile a `try` with a `finally` clause.\n event.target.value = '';\n };\n\n return (\n
\n
\n \n \n \n {status}\n
\n
\n );\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n <>\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/import-from-excel/react/example1.tsx","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { RefObject, useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\nregisterAllModules();\n\nconst SAMPLE_URL = '/docs/scripts/xlsx/employees.xlsx';\n\nconst hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 98000, true, '2022-03-14'],\n ['James Okafor', 'Marketing', 'Marketing Manager', 87500, true, '2021-07-01'],\n ['Li Wei', 'Engineering', 'Product Manager', 104000, false, '2020-11-23'],\n ['Priya Nair', 'Sales', 'Account Executive', 76200, true, '2023-01-09'],\n ['Tom Bakker', 'Support', 'Support Specialist', 58900, true, '2019-05-30'],\n];\n\n// The controls and their status live in their own component. A re-render of the component that\n// renders `HotTable` makes the wrapper send `data` and `colHeaders` to `updateSettings` again,\n// which replaces the imported sheet with the sample rows. A grid fed by a server prop must keep\n// its first value, for example with `const [firstRows] = useState(rows);`.\nconst ImportControls = ({ hotRef }: { hotRef: RefObject }) => {\n const [status, setStatus] = useState('');\n\n const importWorkbook = async (blob: Blob, name: string) => {\n const importPlugin = hotRef.current?.hotInstance?.getPlugin('importFile');\n\n if (!importPlugin) {\n // No grid is mounted, for example while it sits in a hidden tab.\n setStatus('The grid is not ready.');\n\n return;\n }\n\n try {\n const result = await importPlugin.importFromBlob('xlsx', blob, {\n colHeaders: 'firstRow',\n importStyles: true,\n });\n\n setStatus(`Imported ${name}`);\n console.log('Dropped features:', result.dropped);\n } catch (error) {\n // A refused file (an .xls, a password-protected or damaged workbook) rejects with a message\n // that says what to do; the grid keeps its data.\n setStatus((error as Error).message);\n }\n };\n\n const loadSample = async () => {\n const response = await fetch(SAMPLE_URL);\n\n await importWorkbook(await response.blob(), 'employees.xlsx');\n };\n\n const importFile = async (event: React.ChangeEvent) => {\n const file = event.target.files?.[0];\n\n if (file) {\n await importWorkbook(file, file.name);\n }\n\n // Cleared on every path, so picking the same file again fires `change` again. No `finally`:\n // React Compiler does not compile a `try` with a `finally` clause.\n event.target.value = '';\n };\n\n return (\n
\n
\n \n \n \n {status}\n
\n
\n );\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n <>\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/import-from-excel/react/example1.tsx","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__vue__example1.vue.json index 6e4e78b76..1403ef791 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__import-from-excel__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/import-from-excel/vue/example1.vue","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Import from Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/import-from-excel/vue/example1.vue","breadcrumb":["Accessories And Menus","Import from Excel"],"guide":"guides/accessories-and-menus/import-from-excel/import-from-excel.md","guideTitle":"Import from Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/import-from-excel","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example1.ts.json index 643fbf22e..c4604864b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Sheets bar · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotSettings: GridSettings = {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/sheets-bar/angular/example1.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/sheets-bar","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Sheets bar · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotSettings: GridSettings = {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/sheets-bar/angular/example1.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/sheets-bar","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example2.ts.json index dc48a87bd..cdedadbfc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotSettings: GridSettings = {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/sheets-bar/angular/example2.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\n@Component({\n selector: 'app-example2',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotSettings: GridSettings = {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/sheets-bar/angular/example2.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.js.json index d9609db28..ea2fe3738 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Sheets bar · Overview · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example');\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example.js","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Sheets bar · Overview · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example');\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example.js","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.ts.json index 9804c57cb..0105f60c6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Sheets bar · Overview · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example')!;\n\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Sheets bar · Overview · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example')!;\n\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n ],\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n ],\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.js.json index ec3eb450f..cb026adac 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n// Register all Handsontable's modules.\nregisterAllModules();\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example2.js","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n// Register all Handsontable's modules.\nregisterAllModules();\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example2.js","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.ts.json index 2a30eccda..0c7c83b69 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example2.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n sheetsBar: {\n sheets: [\n {\n name: 'Budget',\n data: [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n ],\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n ],\n activeSheet: 0,\n },\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/sheets-bar/javascript/example2.ts","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example.tsx.json index 7f6642e01..d6376c02f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Sheets bar · Overview · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst budgetData = [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n];\n\nconst notesData = [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n];\n\nconst sheets = [\n {\n name: 'Budget',\n data: budgetData,\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: notesData,\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/sheets-bar/react/example.tsx","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Sheets bar · Overview · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst budgetData = [\n ['Marketing', 4200, 5100],\n ['Engineering', 18700, 19200],\n ['Operations', 3100, 2900],\n];\n\nconst notesData = [\n ['Reviewed by Ana García on 2026-03-14'],\n ['Pending sign-off from Finance'],\n];\n\nconst sheets = [\n {\n name: 'Budget',\n data: budgetData,\n settings: {\n colHeaders: ['Category • A', 'Q1 2026 • B', 'Q2 2026 • C'],\n },\n },\n {\n name: 'Notes',\n data: notesData,\n settings: {\n colHeaders: ['Note • A'],\n },\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/sheets-bar/react/example.tsx","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example2.tsx.json index 0cb05467f..0adaa0154 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst budgetData = [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n];\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\nconst sheets = [\n {\n name: 'Budget',\n data: budgetData,\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/sheets-bar/react/example2.tsx","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// One engine, shared by every sheet of the workbook.\nconst engine = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst budgetData = [\n ['Laptops', 4200, '=B1*Rates!B1', '=B1*Rates!B2', '=B1+C1+D1'],\n ['Desks', 1200, '=B2*Rates!B1', '=B2*Rates!B2', '=B2+C2+D2'],\n ['Monitors', 2600, '=B3*Rates!B1', '=B3*Rates!B2', '=B3+C3+D3'],\n ['Chairs', 950, '=B4*Rates!B1', '=B4*Rates!B2', '=B4+C4+D4'],\n ['Docking stations', 780, '=B5*Rates!B1', '=B5*Rates!B2', '=B5+C5+D5'],\n ['Total', '=SUM(B1:B5)', '=SUM(C1:C5)', '=SUM(D1:D5)', '=SUM(E1:E5)'],\n];\n\nconst ratesData = [\n ['VAT rate', 0.23],\n ['Service fee', 0.05],\n];\n\nconst sheets = [\n {\n name: 'Budget',\n data: budgetData,\n settings: {\n colHeaders: ['Item • A', 'Net • B', 'VAT • C', 'Fee • D', 'Gross • E'],\n formulas: { engine, sheetName: 'Budget' },\n },\n },\n {\n name: 'Rates',\n data: ratesData,\n settings: {\n colHeaders: ['Rate • A', 'Value • B'],\n formulas: { engine, sheetName: 'Rates' },\n },\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/sheets-bar/react/example2.tsx","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example.vue.json index 33c529716..923e7c629 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Sheets bar · Overview · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/sheets-bar/vue/example.vue","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Sheets bar · Overview · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/sheets-bar/vue/example.vue","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example","exampleTitle":"Overview","docPermalink":"/sheets-bar","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example2.vue.json index 9e60fa888..a01a4e7b4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__sheets-bar__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/sheets-bar/vue/example2.vue","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Sheets bar · Use formulas across sheets · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/sheets-bar/vue/example2.vue","breadcrumb":["Accessories And Menus","Sheets bar"],"guide":"guides/accessories-and-menus/sheets-bar/sheets-bar.md","guideTitle":"Sheets bar","exampleId":"example2","exampleTitle":"Use formulas across sheets","docPermalink":"/sheets-bar","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__angular__example1.ts.json index 2de59b516..3c3d3ecce 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ Undo and redo · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/undo-redo/angular/example1.ts","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/undo-redo","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ Undo and redo · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ];\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/undo-redo/angular/example1.ts","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/undo-redo","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.js.json index 577bf4f7c..c0ddc44fb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example');\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ],\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/undo-redo/javascript/example.js","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example');\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ],\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/undo-redo/javascript/example.js","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.ts.json index 93cb4d9a3..18037c56e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__javascript__example.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example')!;\n\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ],\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/undo-redo/javascript/example.ts","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example')!;\n\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n ],\n rowHeaders: true,\n colHeaders: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/undo-redo/javascript/example.ts","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__react__example.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__react__example.tsx.json index 04c37302a..b00aa1ef5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__react__example.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__react__example.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/undo-redo/react/example.tsx","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, '2026-04-25'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/undo-redo/react/example.tsx","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__vue__example.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__vue__example.vue.json index 0349462be..762b89039 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__vue__example.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__undo-redo__vue__example.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/undo-redo/vue/example.vue","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ Undo and redo · Basic demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/undo-redo/vue/example.vue","breadcrumb":["Accessories And Menus","Undo and redo"],"guide":"guides/accessories-and-menus/undo-redo/undo-redo.md","guideTitle":"Undo and redo","exampleId":"example","exampleTitle":"Basic demo","docPermalink":"/undo-redo","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example1.ts.json index e979f9854..1d1f492fe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer: BaseRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/angular/example1.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer: BaseRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/angular/example1.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example2.ts.json index 81fadd834..1f2340ae0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"@lucide/angular\": \"1.63.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { GridSettings, HotCellRendererComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { LucideFlag, LucideFlagOff } from '@lucide/angular';\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\n// A renderer component receives the cell's value and coordinates, so the\n// Lucide icon goes in the template. No `data-lucide` placeholder and no\n// `createIcons()` scan - Angular renders the `` itself.\n@Component({\n selector: 'app-flag-renderer',\n standalone: true,\n imports: [LucideFlag, LucideFlagOff],\n // Each icon is its own standalone component, applied as an attribute on an\n // `` element. The icon has no accessible name, so the button carries an\n // `aria-label` that describes what clicking it does. `currentColor` is\n // Lucide's default stroke, so the icon stays visible in both themes.\n template: `\n \n @if (value) {\n \n } @else {\n \n }\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlagRendererComponent extends HotCellRendererComponent {\n get label(): string {\n const taskName = String(this.instance.getDataAtCell(this.row, 0));\n\n return this.value\n ? `Remove the follow-up flag from ${taskName}`\n : `Flag ${taskName} for follow-up`;\n }\n\n toggle(): void {\n this.instance.setDataAtCell(this.row, 3, !this.value);\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: FlagRendererComponent, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/angular/example2.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"Angular"} +{"framework":"angular","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"@lucide/angular\": \"1.63.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { GridSettings, HotCellRendererComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { LucideFlag, LucideFlagOff } from '@lucide/angular';\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\n// A renderer component receives the cell's value and coordinates, so the\n// Lucide icon goes in the template. No `data-lucide` placeholder and no\n// `createIcons()` scan - Angular renders the `` itself.\n@Component({\n selector: 'app-flag-renderer',\n standalone: true,\n imports: [LucideFlag, LucideFlagOff],\n // Each icon is its own standalone component, applied as an attribute on an\n // `` element. The icon has no accessible name, so the button carries an\n // `aria-label` that describes what clicking it does. `currentColor` is\n // Lucide's default stroke, so the icon stays visible in both themes.\n template: `\n \n @if (value) {\n \n } @else {\n \n }\n \n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlagRendererComponent extends HotCellRendererComponent {\n get label(): string {\n const taskName = String(this.instance.getDataAtCell(this.row, 0));\n\n return this.value\n ? `Remove the follow-up flag from ${taskName}`\n : `Flag ${taskName} for follow-up`;\n }\n\n toggle(): void {\n this.instance.setDataAtCell(this.row, 3, !this.value);\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: FlagRendererComponent, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/angular/example2.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.js.json index 9307f0ac7..37c5fdd34 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON = '';\nconst FLAG_EMPTY_ICON = '';\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute('aria-label', value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`);\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n td.innerText = '';\n td.appendChild(button);\n return td;\n};\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example1.js","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON = '';\nconst FLAG_EMPTY_ICON = '';\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute('aria-label', value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`);\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n td.innerText = '';\n td.appendChild(button);\n return td;\n};\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example1.js","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.ts.json index f7b65c205..bf7261594 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer: BaseRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example1.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\n// The icon itself has no accessible name, so the button carries an\n// `aria-label` that describes what clicking it does.\nconst flagRenderer: BaseRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example1.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.js.json index 5741bfc7d..8e383675d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { createIcons, Flag, FlagOff } from 'lucide';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n// Lucide reads a `data-lucide` placeholder and replaces it with an inline\n// ``. The renderer writes the placeholder, then triggers the swap.\nconst flagRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = ``;\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n button.setAttribute('aria-label', value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`);\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n td.innerText = '';\n td.appendChild(button);\n // `root` scopes the scan to this cell. Without it, Lucide walks the whole\n // document on every cell render, which a grid does once per visible cell.\n // `currentColor` keeps the icon visible in both light and dark themes.\n createIcons({\n icons: { Flag, FlagOff },\n attrs: { width: '18', height: '18', stroke: 'currentColor' },\n root: td,\n });\n return td;\n};\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example2.js","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { createIcons, Flag, FlagOff } from 'lucide';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n// Lucide reads a `data-lucide` placeholder and replaces it with an inline\n// ``. The renderer writes the placeholder, then triggers the swap.\nconst flagRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = ``;\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n button.setAttribute('aria-label', value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`);\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n td.innerText = '';\n td.appendChild(button);\n // `root` scopes the scan to this cell. Without it, Lucide walks the whole\n // document on every cell render, which a grid does once per visible cell.\n // `currentColor` keeps the icon visible in both light and dark themes.\n createIcons({\n icons: { Flag, FlagOff },\n attrs: { width: '18', height: '18', stroke: 'currentColor' },\n root: td,\n });\n return td;\n};\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example2.js","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.ts.json index 15346864e..f8a42aebe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\nimport { createIcons, Flag, FlagOff } from 'lucide';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Lucide reads a `data-lucide` placeholder and replaces it with an inline\n// ``. The renderer writes the placeholder, then triggers the swap.\nconst flagRenderer: BaseRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = ``;\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n // `root` scopes the scan to this cell. Without it, Lucide walks the whole\n // document on every cell render, which a grid does once per visible cell.\n // `currentColor` keeps the icon visible in both light and dark themes.\n createIcons({\n icons: { Flag, FlagOff },\n attrs: { width: '18', height: '18', stroke: 'currentColor' },\n root: td,\n });\n\n return td;\n};\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example2.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\nimport { createIcons, Flag, FlagOff } from 'lucide';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Lucide reads a `data-lucide` placeholder and replaces it with an inline\n// ``. The renderer writes the placeholder, then triggers the swap.\nconst flagRenderer: BaseRenderer = (instance, td, row, _col, _prop, value) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = ``;\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n // `root` scopes the scan to this cell. Without it, Lucide walks the whole\n // document on every cell render, which a grid does once per visible cell.\n // `currentColor` keeps the icon visible in both light and dark themes.\n createIcons({\n icons: { Flag, FlagOff },\n attrs: { width: '18', height: '18', stroke: 'currentColor' },\n root: td,\n });\n\n return td;\n};\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Due date', 'Flagged'],\n columns: [\n { data: 'task' },\n { data: 'assignee' },\n { data: 'dueDate', type: 'date', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'flagged', renderer: flagRenderer, className: 'htCenter' },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/javascript/example2.ts","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example1.tsx.json index daf6e980d..1670f1726 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\nconst ExampleComponent = () => {\n // The icon itself has no accessible name, so the button carries an\n // `aria-label` that describes what clicking it does.\n const flagRenderer: BaseRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n ) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/react/example1.tsx","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// Icons from the `@handsontable/spreadsheet-icons` package - see the \"Icon\n// pack\" reference page for the full set.\n// `currentColor` picks up the button's text color, so the icon stays visible\n// in both light and dark themes instead of a hardcoded color disappearing\n// against the background.\nconst FLAG_FULL_ICON =\n '';\nconst FLAG_EMPTY_ICON =\n '';\n\nconst ExampleComponent = () => {\n // The icon itself has no accessible name, so the button carries an\n // `aria-label` that describes what clicking it does.\n const flagRenderer: BaseRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n ) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const button = document.createElement('button');\n\n button.type = 'button';\n button.style.cssText = 'background: none; border: none; cursor: pointer; padding: 0.25rem;';\n button.innerHTML = value ? FLAG_FULL_ICON : FLAG_EMPTY_ICON;\n button.setAttribute(\n 'aria-label',\n value ? `Remove the follow-up flag from ${taskName}` : `Flag ${taskName} for follow-up`\n );\n button.addEventListener('click', () => {\n instance.setDataAtCell(row, 3, !value);\n });\n\n td.innerText = '';\n td.appendChild(button);\n\n return td;\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/react/example1.tsx","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example2.tsx.json index 69f10f419..c22c3378e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"lucide-react\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, HotRendererProps } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Flag, FlagOff } from 'lucide-react';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// A renderer component receives the cell's value and coordinates, so the\n// Lucide icon goes in as JSX. No `data-lucide` placeholder and no\n// `createIcons()` scan - React renders the `` itself.\n//\n// Pass a renderer component through ``, not through\n// a `renderer` key in the `columns` array. Only the prop is wrapped for React;\n// a component in `columns` reaches the grid as a plain renderer function and\n// is called with `(instance, TD, row, ...)` instead of a props object.\nconst FlagCell = ({ instance, row, value }: HotRendererProps) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const flagged = Boolean(value);\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n const label = flagged\n ? `Remove the follow-up flag from ${taskName}`\n : `Flag ${taskName} for follow-up`;\n\n return (\n instance.setDataAtCell(row, 3, !flagged)}\n >\n {/* `currentColor` is Lucide's default stroke, so the icon stays visible\n in both light and dark themes. */}\n {flagged ? : }\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/react/example2.tsx","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"lucide-react\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, HotRendererProps } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Flag, FlagOff } from 'lucide-react';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Task {\n task: string;\n assignee: string;\n dueDate: string;\n flagged: boolean;\n}\n\nconst data: Task[] = [\n { task: 'Update API docs', assignee: 'Ana García', dueDate: '2025-06-30', flagged: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', dueDate: '2025-06-18', flagged: false },\n { task: 'Review pull request', assignee: 'Li Wei', dueDate: '2025-06-20', flagged: false },\n { task: 'Write release notes', assignee: 'Sara Nowak', dueDate: '2025-06-25', flagged: true },\n { task: 'Fix flaky test', assignee: 'Marco Rossi', dueDate: '2025-06-22', flagged: false },\n];\n\n// A renderer component receives the cell's value and coordinates, so the\n// Lucide icon goes in as JSX. No `data-lucide` placeholder and no\n// `createIcons()` scan - React renders the `` itself.\n//\n// Pass a renderer component through ``, not through\n// a `renderer` key in the `columns` array. Only the prop is wrapped for React;\n// a component in `columns` reaches the grid as a plain renderer function and\n// is called with `(instance, TD, row, ...)` instead of a props object.\nconst FlagCell = ({ instance, row, value }: HotRendererProps) => {\n const taskName = String(instance.getDataAtCell(row, 0));\n const flagged = Boolean(value);\n // The icon has no accessible name, so the button carries an `aria-label`\n // that describes what clicking it does.\n const label = flagged\n ? `Remove the follow-up flag from ${taskName}`\n : `Flag ${taskName} for follow-up`;\n\n return (\n instance.setDataAtCell(row, 3, !flagged)}\n >\n {/* `currentColor` is Lucide's default stroke, so the icon stays visible\n in both light and dark themes. */}\n {flagged ? : }\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/react/example2.tsx","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example1.vue.json index eeb5b93a6..828e5cf46 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/vue/example1.vue","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ How to use icons in cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/vue/example1.vue","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/use-icons-in-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example2.vue.json index 37c5cfea5..02ad86c82 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__accessories-and-menus__use-icons-in-cells__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/vue/example2.vue","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Accessories And Menus ▸ How to use icons in cells · Use a third-party icon set · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"lucide\": \"1.63.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/accessories-and-menus/use-icons-in-cells/vue/example2.vue","breadcrumb":["Accessories And Menus","How to use icons in cells"],"guide":"guides/accessories-and-menus/use-icons-in-cells/use-icons-in-cells.md","guideTitle":"How to use icons in cells","exampleId":"example2","exampleTitle":"Use a third-party icon set","docPermalink":"/use-icons-in-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example1.ts.json index 23b8bfab0..0eb37c02b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Async values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { CellChange } from 'handsontable';\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\n@Component({\n selector: 'example1-async-values',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange: (changes: CellChange[] | null) => {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n this.lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n lookUpAll(): void {\n this.lookUpRows(0, this.hotTable.hotInstance!.countRows() - 1);\n }\n\n lookUpRows(fromRow: number, toRow: number): void {\n const hot = this.hotTable.hotInstance!;\n\n hot.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/async-values/angular/example1.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Async values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { CellChange } from 'handsontable';\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\n@Component({\n selector: 'example1-async-values',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange: (changes: CellChange[] | null) => {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n this.lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n lookUpAll(): void {\n this.lookUpRows(0, this.hotTable.hotInstance!.countRows() - 1);\n }\n\n lookUpRows(fromRow: number, toRow: number): void {\n const hot = this.hotTable.hotInstance!;\n\n hot.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/async-values/angular/example1.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example2.ts.json index 6d05baaff..8c18b0c99 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\n@Component({\n selector: 'example2-async-values',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n {{ progress }}\n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly changeDetector = inject(ChangeDetectorRef);\n\n progress = '0 of 12 done, 0 failed';\n\n readonly data = [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ];\n\n // Show how many cells are done and how many failed.\n private readonly updateProgress = () => {\n const hot = this.hotTable.hotInstance!;\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n this.progress = `${done} of ${hot.countRows()} done, ${this.plugin.countErrors()} failed`;\n this.changeDetector.markForCheck();\n };\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n afterAsyncValueStart: this.updateProgress,\n afterAsyncValueResolve: this.updateProgress,\n afterAsyncValueReject: this.updateProgress,\n afterAsyncValueCancel: this.updateProgress,\n afterAsyncValuesIdle: this.updateProgress,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get plugin() {\n return this.hotTable.hotInstance!.getPlugin('asyncValues');\n }\n\n classify(): void {\n const hot = this.hotTable.hotInstance!;\n\n this.plugin.setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/async-values/angular/example2.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\n@Component({\n selector: 'example2-async-values',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n {{ progress }}\n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly changeDetector = inject(ChangeDetectorRef);\n\n progress = '0 of 12 done, 0 failed';\n\n readonly data = [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ];\n\n // Show how many cells are done and how many failed.\n private readonly updateProgress = () => {\n const hot = this.hotTable.hotInstance!;\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n this.progress = `${done} of ${hot.countRows()} done, ${this.plugin.countErrors()} failed`;\n this.changeDetector.markForCheck();\n };\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n afterAsyncValueStart: this.updateProgress,\n afterAsyncValueResolve: this.updateProgress,\n afterAsyncValueReject: this.updateProgress,\n afterAsyncValueCancel: this.updateProgress,\n afterAsyncValuesIdle: this.updateProgress,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get plugin() {\n return this.hotTable.hotInstance!.getPlugin('asyncValues');\n }\n\n classify(): void {\n const hot = this.hotTable.hotInstance!;\n\n this.plugin.setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/async-values/angular/example2.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.js.json index e4fe6a762..d34570c83 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Async values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst products = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku, signal) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n },\n 600 + Math.random() * 1400,\n );\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange(changes) {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction lookUpRows(fromRow, toRow) {\n hot\n .getPlugin('asyncValues')\n .setAsyncValues(\n fromRow,\n 1,\n toRow,\n 1,\n ({ physicalRow, signal }) => lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku'), signal),\n { dependsOn: ['sku'] },\n );\n}\n\ndocument.querySelector('#lookup').addEventListener('click', () => {\n lookUpRows(0, hot.countRows() - 1);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/async-values/javascript/example1.js","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Async values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst products = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku, signal) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n },\n 600 + Math.random() * 1400,\n );\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange(changes) {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction lookUpRows(fromRow, toRow) {\n hot\n .getPlugin('asyncValues')\n .setAsyncValues(\n fromRow,\n 1,\n toRow,\n 1,\n ({ physicalRow, signal }) => lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku'), signal),\n { dependsOn: ['sku'] },\n );\n}\n\ndocument.querySelector('#lookup').addEventListener('click', () => {\n lookUpRows(0, hot.countRows() - 1);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/async-values/javascript/example1.js","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.ts.json index 1e269b43d..b5193d4bb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Async values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange(changes) {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction lookUpRows(fromRow: number, toRow: number) {\n hot.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n}\n\ndocument.querySelector('#lookup')!.addEventListener('click', () => {\n lookUpRows(0, hot.countRows() - 1);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/async-values/javascript/example1.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Async values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data: [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product', readOnly: true },\n ],\n colWidths: [120, 220],\n rowHeaders: true,\n height: 'auto',\n asyncValues: true,\n // Look the product up again when its SKU changes.\n afterChange(changes) {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction lookUpRows(fromRow: number, toRow: number) {\n hot.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n}\n\ndocument.querySelector('#lookup')!.addEventListener('click', () => {\n lookUpRows(0, hot.countRows() - 1);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/async-values/javascript/example1.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.js.json index 85b825abd..2ac9d463d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst categories = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products, signal) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => {\n resolve(\n products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }),\n );\n },\n 500 + Math.random() * 700,\n );\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example2');\nconst output = document.querySelector('#progress');\nconst hot = new Handsontable(container, {\n data: [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst plugin = hot.getPlugin('asyncValues');\n\n// Show how many cells are done and how many failed.\nconst updateProgress = () => {\n const done = hot.getSourceDataAtCol(2).filter((category) => category !== null).length;\n\n output.textContent = `${done} of ${hot.countRows()} done, ${plugin.countErrors()} failed`;\n};\n\nhot.addHook('afterAsyncValueStart', updateProgress);\nhot.addHook('afterAsyncValueResolve', updateProgress);\nhot.addHook('afterAsyncValueReject', updateProgress);\nhot.addHook('afterAsyncValueCancel', updateProgress);\nhot.addHook('afterAsyncValuesIdle', updateProgress);\n\ndocument.querySelector('#classify').addEventListener('click', () => {\n plugin.setAsyncValuesInBatches(\n 'all',\n 'category',\n (cells, signal) =>\n classifyProducts(\n cells.map((cell) => hot.getSourceDataAtCell(cell.physicalRow, 'product')),\n signal,\n ),\n { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } },\n );\n});\ndocument.querySelector('#retry').addEventListener('click', () => plugin.retryErrors());\ndocument.querySelector('#stop').addEventListener('click', () => plugin.cancelAll());\nupdateProgress();","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/async-values/javascript/example2.js","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst categories = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products, signal) {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => {\n resolve(\n products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }),\n );\n },\n 500 + Math.random() * 700,\n );\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example2');\nconst output = document.querySelector('#progress');\nconst hot = new Handsontable(container, {\n data: [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst plugin = hot.getPlugin('asyncValues');\n\n// Show how many cells are done and how many failed.\nconst updateProgress = () => {\n const done = hot.getSourceDataAtCol(2).filter((category) => category !== null).length;\n\n output.textContent = `${done} of ${hot.countRows()} done, ${plugin.countErrors()} failed`;\n};\n\nhot.addHook('afterAsyncValueStart', updateProgress);\nhot.addHook('afterAsyncValueResolve', updateProgress);\nhot.addHook('afterAsyncValueReject', updateProgress);\nhot.addHook('afterAsyncValueCancel', updateProgress);\nhot.addHook('afterAsyncValuesIdle', updateProgress);\n\ndocument.querySelector('#classify').addEventListener('click', () => {\n plugin.setAsyncValuesInBatches(\n 'all',\n 'category',\n (cells, signal) =>\n classifyProducts(\n cells.map((cell) => hot.getSourceDataAtCell(cell.physicalRow, 'product')),\n signal,\n ),\n { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } },\n );\n});\ndocument.querySelector('#retry').addEventListener('click', () => plugin.retryErrors());\ndocument.querySelector('#stop').addEventListener('click', () => plugin.cancelAll());\nupdateProgress();","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/async-values/javascript/example2.js","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.ts.json index fe2f97308..88a19a2c4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example2')!;\nconst output = document.querySelector('#progress')!;\nconst hot = new Handsontable(container, {\n data: [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst plugin = hot.getPlugin('asyncValues');\n\n// Show how many cells are done and how many failed.\nconst updateProgress = () => {\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n output.textContent = `${done} of ${hot.countRows()} done, ${plugin.countErrors()} failed`;\n};\n\nhot.addHook('afterAsyncValueStart', updateProgress);\nhot.addHook('afterAsyncValueResolve', updateProgress);\nhot.addHook('afterAsyncValueReject', updateProgress);\nhot.addHook('afterAsyncValueCancel', updateProgress);\nhot.addHook('afterAsyncValuesIdle', updateProgress);\n\ndocument.querySelector('#classify')!.addEventListener('click', () => {\n plugin.setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n});\ndocument.querySelector('#retry')!.addEventListener('click', () => plugin.retryErrors());\ndocument.querySelector('#stop')!.addEventListener('click', () => plugin.cancelAll());\nupdateProgress();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/async-values/javascript/example2.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst container = document.querySelector('#example2')!;\nconst output = document.querySelector('#progress')!;\nconst hot = new Handsontable(container, {\n data: [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n ],\n columns: [\n { data: 'sku', title: 'SKU' },\n { data: 'product', title: 'Product' },\n { data: 'category', title: 'Category', readOnly: true },\n ],\n colWidths: [110, 230, 130],\n rowId: 'id',\n asyncValues: { concurrency: 2 },\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst plugin = hot.getPlugin('asyncValues');\n\n// Show how many cells are done and how many failed.\nconst updateProgress = () => {\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n output.textContent = `${done} of ${hot.countRows()} done, ${plugin.countErrors()} failed`;\n};\n\nhot.addHook('afterAsyncValueStart', updateProgress);\nhot.addHook('afterAsyncValueResolve', updateProgress);\nhot.addHook('afterAsyncValueReject', updateProgress);\nhot.addHook('afterAsyncValueCancel', updateProgress);\nhot.addHook('afterAsyncValuesIdle', updateProgress);\n\ndocument.querySelector('#classify')!.addEventListener('click', () => {\n plugin.setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n});\ndocument.querySelector('#retry')!.addEventListener('click', () => plugin.retryErrors());\ndocument.querySelector('#stop')!.addEventListener('click', () => plugin.cancelAll());\nupdateProgress();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/async-values/javascript/example2.ts","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example1.tsx.json index 531330ee3..6118f66c9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Async values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst data = [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const lookUpRows = (fromRow: number, toRow: number) => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n };\n\n const lookUpAll = () => {\n lookUpRows(0, (hotRef.current?.hotInstance?.countRows() ?? 0) - 1);\n };\n\n return (\n <>\n
\n
\n \n
\n
\n {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/async-values/react/example1.tsx","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Async values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst products: Record = {\n 'A-100': 'Desk lamp',\n 'B-200': 'Office chair',\n 'C-300': 'Standing desk',\n 'D-400': 'Monitor arm',\n};\n\n// A stand-in for a server request: it answers after a delay, and stops when the signal is aborted.\nfunction lookUpProduct(sku: string, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n if (products[sku]) {\n resolve(products[sku]);\n } else {\n reject(new Error(`Unknown SKU: ${sku}`));\n }\n }, 600 + Math.random() * 1400);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst data = [\n { sku: 'A-100', product: '' },\n { sku: 'B-200', product: '' },\n { sku: 'X-999', product: '' },\n { sku: 'C-300', product: '' },\n { sku: 'D-400', product: '' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const lookUpRows = (fromRow: number, toRow: number) => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.getPlugin('asyncValues').setAsyncValues(fromRow, 1, toRow, 1, ({ physicalRow, signal }) => (\n lookUpProduct(hot.getSourceDataAtCell(physicalRow, 'sku') as string, signal)\n ), { dependsOn: ['sku'] });\n };\n\n const lookUpAll = () => {\n lookUpRows(0, (hotRef.current?.hotInstance?.countRows() ?? 0) - 1);\n };\n\n return (\n <>\n
\n
\n \n
\n
\n {\n changes?.forEach(([row, prop]) => {\n if (prop === 'sku') {\n lookUpRows(row, row);\n }\n });\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/async-values/react/example1.tsx","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example2.tsx.json index 39e6f67d2..eeefca0bf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst data = [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [progress, setProgress] = useState(`0 of ${data.length} done, 0 failed`);\n\n const getPlugin = () => hotRef.current!.hotInstance!.getPlugin('asyncValues');\n\n // Show how many cells are done and how many failed.\n const updateProgress = () => {\n const hot = hotRef.current!.hotInstance!;\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n setProgress(`${done} of ${hot.countRows()} done, ${getPlugin().countErrors()} failed`);\n };\n\n const classify = () => {\n const hot = hotRef.current!.hotInstance!;\n\n getPlugin().setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n };\n\n return (\n <>\n
\n
\n \n \n \n {progress}\n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/async-values/react/example2.tsx","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst categories: [string, string][] = [\n ['bottle', 'Drinkware'],\n ['water', 'Drinkware'],\n ['mouse', 'Electronics'],\n ['usb', 'Electronics'],\n ['speaker', 'Electronics'],\n ['chair', 'Furniture'],\n ['desk', 'Furniture'],\n ['stand', 'Furniture'],\n ['bag', 'Apparel'],\n];\n\n// A stand-in for a model call: it classifies a batch after a delay, and stops when the signal is aborted.\nfunction classifyProducts(products: string[], signal: AbortSignal): Promise<(string | Error)[]> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n resolve(products.map((product) => {\n if (product === 'Ceramic Mug Set') {\n return new Error('The model could not classify this product');\n }\n\n return categories.find(([keyword]) => product.toLowerCase().includes(keyword))?.[1] ?? 'Other';\n }));\n }, 500 + Math.random() * 700);\n\n signal.addEventListener('abort', () => {\n clearTimeout(timer);\n reject(signal.reason);\n });\n });\n}\n\nconst data = [\n { id: 1, sku: 'SKU-4821', product: 'Stainless Steel Water Bottle', category: null },\n { id: 2, sku: 'SKU-0093', product: 'Wireless Mouse', category: null },\n { id: 3, sku: 'SKU-1170', product: 'Ergonomic Office Chair', category: null },\n { id: 4, sku: 'SKU-2208', product: 'USB-C Charging Cable', category: null },\n { id: 5, sku: 'SKU-3341', product: 'Aluminum Water Filter', category: null },\n { id: 6, sku: 'SKU-4412', product: 'Canvas Tote Bag', category: null },\n { id: 7, sku: 'SKU-5088', product: 'USB-C Hub', category: null },\n { id: 8, sku: 'SKU-6120', product: 'Ceramic Mug Set', category: null },\n { id: 9, sku: 'SKU-7294', product: 'Desk Lamp', category: null },\n { id: 10, sku: 'SKU-8015', product: 'Laptop Stand', category: null },\n { id: 11, sku: 'SKU-9166', product: 'Bluetooth Speaker', category: null },\n { id: 12, sku: 'SKU-1042', product: 'Standing Desk', category: null },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [progress, setProgress] = useState(`0 of ${data.length} done, 0 failed`);\n\n const getPlugin = () => hotRef.current!.hotInstance!.getPlugin('asyncValues');\n\n // Show how many cells are done and how many failed.\n const updateProgress = () => {\n const hot = hotRef.current!.hotInstance!;\n const done = hot.getSourceDataAtCol(2).filter(category => category !== null).length;\n\n setProgress(`${done} of ${hot.countRows()} done, ${getPlugin().countErrors()} failed`);\n };\n\n const classify = () => {\n const hot = hotRef.current!.hotInstance!;\n\n getPlugin().setAsyncValuesInBatches('all', 'category', (cells, signal) => (\n classifyProducts(cells.map(cell => hot.getSourceDataAtCell(cell.physicalRow, 'product') as string), signal)\n ), { batchSize: 4, dependsOn: ['product'], source: 'AI.classify', meta: { aiGenerated: true } });\n };\n\n return (\n <>\n
\n
\n \n \n \n {progress}\n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/async-values/react/example2.tsx","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example1.vue.json index 87f886c7a..7192baf28 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Async values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/async-values/vue/example1.vue","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Async values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/async-values/vue/example1.vue","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/async-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example2.vue.json index 279ed3376..bd3f6dfd2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__async-values__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/async-values/vue/example2.vue","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Async values · Show progress, retry, and stop · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/async-values/vue/example2.vue","breadcrumb":["Cell Features","Async values"],"guide":"guides/cell-features/async-values/async-values.md","guideTitle":"Async values","exampleId":"example2","exampleTitle":"Show progress, retry, and stop","docPermalink":"/async-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example1.ts.json index 6c866fdff..8a43a2d7a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example1.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example1.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example2.ts.json index 9276ac34a..7e46a0f57 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example2.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example2.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example3.ts.json index bbdfefcbb..df5fde360 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport type { CellRange } from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example3-autofill-values',\n template: `\n {{ output }}\n \n `,\n})\nexport class AppComponent {\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n output = 'Drag the fill handle to see the affected range logged here.';\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n beforeAutofill: (selectionData: Handsontable.CellValue[][]) =>\n // Round every filled number up to the nearest multiple of 5.\n selectionData.map((row) => row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value))),\n afterAutofill: (\n fillData: Handsontable.CellValue[][],\n sourceRange: CellRange,\n targetRange: CellRange,\n direction: 'up' | 'down' | 'left' | 'right'\n ) => {\n this.output =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example3.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport type { CellRange } from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example3-autofill-values',\n template: `\n {{ output }}\n \n `,\n})\nexport class AppComponent {\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n output = 'Drag the fill handle to see the affected range logged here.';\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n beforeAutofill: (selectionData: Handsontable.CellValue[][]) =>\n // Round every filled number up to the nearest multiple of 5.\n selectionData.map((row) => row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value))),\n afterAutofill: (\n fillData: Handsontable.CellValue[][],\n sourceRange: CellRange,\n targetRange: CellRange,\n direction: 'up' | 'down' | 'left' | 'right'\n ) => {\n this.output =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example3.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example4.ts.json index 4f3fcf0e1..78533f5d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n selector: 'example4-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n // create an external HyperFormula instance\n readonly hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n readonly data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example4.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n selector: 'example4-autofill-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n // create an external HyperFormula instance\n readonly hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n readonly data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/autofill-values/angular/example4.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.js.json index e700b1ebf..41771cd7f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// or, use `updateData()` to replace `data` without resetting states\nhot.loadData(data);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example1.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// or, use `updateData()` to replace `data` without resetting states\nhot.loadData(data);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example1.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.ts.json index 58037a88d..3bd32d327 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// or, use `updateData()` to replace `data` without resetting states\nhot.loadData(data);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example1.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true, // possible values: true, false, \"horizontal\", \"vertical\",\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// or, use `updateData()` to replace `data` without resetting states\nhot.loadData(data);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example1.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.js.json index 2abba0787..69edd0982 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example2.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example2.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.ts.json index c0f1a7ff7..f6a585da3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example2.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: {\n direction: 'vertical',\n autoInsertRow: true,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example2.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.js.json index e3f25dfd4..36fe22ffd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Drag the fill handle to see the affected range logged here.\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example3');\nconst output = document.querySelector('#output');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n beforeAutofill(selectionData) {\n // Round every filled number up to the nearest multiple of 5.\n return selectionData.map((row) =>\n row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value)),\n );\n },\n afterAutofill(fillData, sourceRange, targetRange, direction) {\n output.innerText =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example3.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Drag the fill handle to see the affected range logged here.\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example3');\nconst output = document.querySelector('#output');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n beforeAutofill(selectionData) {\n // Round every filled number up to the nearest multiple of 5.\n return selectionData.map((row) =>\n row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value)),\n );\n },\n afterAutofill(fillData, sourceRange, targetRange, direction) {\n output.innerText =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example3.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.ts.json index f6e536f55..894d9bafd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Drag the fill handle to see the affected range logged here.\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example3')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n beforeAutofill(selectionData) {\n // Round every filled number up to the nearest multiple of 5.\n return selectionData.map((row) =>\n row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value))\n );\n },\n afterAutofill(fillData, sourceRange, targetRange, direction) {\n output.innerText =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example3.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Drag the fill handle to see the affected range logged here.\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst container = document.querySelector('#example3')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes'],\n colWidths: [80, 62, 110, 118, 110],\n stretchH: 'all',\n fillHandle: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n beforeAutofill(selectionData) {\n // Round every filled number up to the nearest multiple of 5.\n return selectionData.map((row) =>\n row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value))\n );\n },\n afterAutofill(fillData, sourceRange, targetRange, direction) {\n output.innerText =\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`;\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example3.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.js.json index 621b54842..21f92c017 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example4.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example4.js","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.ts.json index d7386a715..5149c69bb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number | null)[][] = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example4.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number | null)[][] = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Quantity', 'Unit price', 'Total', 'Total with tax', 'Tax rate (E1 only)'],\n rowHeaders: true,\n stretchH: 'all',\n fillHandle: true,\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/autofill-values/javascript/example4.ts","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example1.tsx.json index e5bd6f81c..8051dd795 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Autofill values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example1.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Autofill values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example1.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example2.tsx.json index e5e5620b4..855333e28 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example2.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example2.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example3.tsx.json index 6d63af24f..c4b36b42c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Defined outside the component so autofill can mutate this array in place\n// without a re-render (triggered by `setOutput`) resetting it to its initial values.\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('Drag the fill handle to see the affected range logged here.');\n\n return (\n <>\n \n {output}\n \n \n // Round every filled number up to the nearest multiple of 5.\n selectionData.map((row) => row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value)))\n }\n afterAutofill={(fillData, sourceRange, targetRange, direction) => {\n setOutput(\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`\n );\n }}\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example3.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Defined outside the component so autofill can mutate this array in place\n// without a re-render (triggered by `setOutput`) resetting it to its initial values.\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', '', '', '', ''],\n ['Boron', '', '', '', ''],\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('Drag the fill handle to see the affected range logged here.');\n\n return (\n <>\n \n {output}\n \n \n // Round every filled number up to the nearest multiple of 5.\n selectionData.map((row) => row.map((value) => (typeof value === 'number' ? Math.ceil(value / 5) * 5 : value)))\n }\n afterAutofill={(fillData, sourceRange, targetRange, direction) => {\n setOutput(\n `Filled rows ${targetRange.from.row}-${targetRange.to.row}, ` +\n `columns ${targetRange.from.col}-${targetRange.to.col} (direction: \"${direction}\").`\n );\n }}\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example3.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example4.tsx.json index 4a191c505..0b865abfd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example4.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [12, 4.5, '=A1*B1', '=C1*(1+$E$1)', 0.2],\n [8, 12.25, null, null, null],\n [20, 3.8, null, null, null],\n [5, 29.99, null, null, null],\n [15, 7.2, null, null, null],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/autofill-values/react/example4.tsx","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example1.vue.json index 1789246b0..bc4d6b267 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example1.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example1.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autofill-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example2.vue.json index f40fb570b..1200c5375 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example2.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Autofill in a vertical direction only and creating new rows · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example2.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example2","exampleTitle":"Autofill in a vertical direction only and creating new rows","docPermalink":"/autofill-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example3.vue.json index 91e951705..f680a4641 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example3.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Altering and tracking autofilled values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example3.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example3","exampleTitle":"Altering and tracking autofilled values","docPermalink":"/autofill-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example4.vue.json index 7735ea335..11bebeec8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__autofill-values__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example4.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Autofill values · Autofill and formulas · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/autofill-values/vue/example4.vue","breadcrumb":["Cell Features","Autofill values"],"guide":"guides/cell-features/autofill-values/autofill-values.md","guideTitle":"Autofill values","exampleId":"example4","exampleTitle":"Autofill and formulas","docPermalink":"/autofill-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example1.ts.json index d338eb08a..c6dc8faea 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clickable links · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-clickable-links',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clickable-links/angular/example1.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clickable links · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-clickable-links',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clickable-links/angular/example1.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example2.ts.json index a3327eb56..18227679a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clickable links · Configure the links · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-clickable-links',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clickable-links/angular/example2.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clickable links · Configure the links · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-clickable-links',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clickable-links/angular/example2.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.js.json index aff0a17a6..8b6bff803 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clickable links · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example1.js","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clickable links · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example1.js","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.ts.json index dd003548e..990d8f898 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clickable links · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example1.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clickable links · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Owner', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 120, 260, 220, 320],\n height: 'auto',\n autoLink: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example1.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.js.json index db9932c73..a2ce427be 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clickable links · Configure the links · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example2.js","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clickable links · Configure the links · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example2.js","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.ts.json index 41d6a1542..5c6a92789 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clickable links · Configure the links · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example2.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clickable links · Configure the links · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n ],\n colHeaders: ['Task', 'Tracker', 'Contact', 'Notes'],\n colWidths: [180, 260, 220, 320],\n height: 'auto',\n // Open links in the same tab, link web URLs only, and add a class to every link.\n autoLink: {\n target: '_self',\n schemes: ['http', 'https'],\n className: 'tracker-link',\n },\n columns: [\n {},\n // Link only a cell whose whole value is a URL.\n { autoLink: { inline: false } },\n // Keep the contact column as plain text.\n { autoLink: false },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clickable-links/javascript/example2.ts","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example1.tsx.json index 0e3a24619..a3bbd2068 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clickable links · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clickable-links/react/example1.tsx","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clickable links · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'Ana García', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs, review by Friday.'],\n ['Deploy hotfix', 'James Okafor', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'Li Wei', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'Priya Nair', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls for the checklist.'],\n ['Audit access logs', 'Tomás Rivera', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clickable-links/react/example1.tsx","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example2.tsx.json index 1bf8b87cc..55c6de91b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clickable links · Configure the links · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clickable-links/react/example2.tsx","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clickable links · Configure the links · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'https://tracker.example.com/tasks/4821', 'mailto:ana.garcia@example.com', 'Draft at https://wiki.example.com/api-docs'],\n ['Deploy hotfix', 'https://tracker.example.com/tasks/4830', 'mailto:james.okafor@example.com', 'Rollback plan: https://wiki.example.com/rollback'],\n ['Migrate CI runners', 'https://tracker.example.com/tasks/4835', 'tel:+48123456789', 'Blocked on vendor call.'],\n ['Renew TLS certificates', 'https://tracker.example.com/tasks/4841', 'mailto:priya.nair@example.com', 'See https://wiki.example.com/tls'],\n ['Audit access logs', 'https://tracker.example.com/tasks/4846', 'tel:+48987654321', 'Report due 2025-06-30.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clickable-links/react/example2.tsx","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example1.vue.json index 2d1af92ee..e4d3a0062 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clickable links · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clickable-links/vue/example1.vue","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clickable links · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clickable-links/vue/example1.vue","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/clickable-links","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example2.vue.json index 983b7c3c0..1bb700425 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clickable-links__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clickable links · Configure the links · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clickable-links/vue/example2.vue","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clickable links · Configure the links · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clickable-links/vue/example2.vue","breadcrumb":["Cell Features","Clickable links"],"guide":"guides/cell-features/clickable-links/clickable-links.md","guideTitle":"Clickable links","exampleId":"example2","exampleTitle":"Configure the links","docPermalink":"/clickable-links","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example1.ts.json index 9cb95626c..05868718b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Update API docs', 'Backend', 'In progress', 'Ana García', '2026-05-10'],\n ['Deploy hotfix', 'DevOps', 'Done', 'David Kim', '2026-04-02'],\n ['Write tests', 'QA', 'Blocked', 'Sara Johansson', '2026-05-20'],\n ['Review PRs', 'Backend', 'In progress', 'Li Wei', '2026-04-15'],\n ['Update README', 'Docs', 'Done', 'Emma Wilson', '2026-03-28'],\n ];\n\n readonly gridSettings: GridSettings ={\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example1.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Update API docs', 'Backend', 'In progress', 'Ana García', '2026-05-10'],\n ['Deploy hotfix', 'DevOps', 'Done', 'David Kim', '2026-04-02'],\n ['Write tests', 'QA', 'Blocked', 'Sara Johansson', '2026-05-20'],\n ['Review PRs', 'Backend', 'In progress', 'Li Wei', '2026-04-15'],\n ['Update README', 'Docs', 'Done', 'Emma Wilson', '2026-03-28'],\n ];\n\n readonly gridSettings: GridSettings ={\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example1.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example2.ts.json index 7549deb48..785c8a97f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy with headers · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['EMEA', 142000, 48, 168000, 53, 195000, 61, 221000, 72, 726000],\n ['APAC', 98000, 31, 115000, 38, 134000, 44, 158000, 52, 505000],\n ['AMER', 213000, 68, 247000, 79, 289000, 91, 334000, 108, 1083000],\n ['LATAM', 54000, 17, 63000, 20, 74000, 24, 87000, 28, 278000],\n ['MEA', 38000, 12, 44000, 14, 52000, 17, 61000, 20, 195000],\n ];\n\n readonly gridSettings: GridSettings = {\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example2.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy with headers · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['EMEA', 142000, 48, 168000, 53, 195000, 61, 221000, 72, 726000],\n ['APAC', 98000, 31, 115000, 38, 134000, 44, 158000, 52, 505000],\n ['AMER', 213000, 68, 247000, 79, 289000, 91, 334000, 108, 1083000],\n ['LATAM', 54000, 17, 63000, 20, 74000, 24, 87000, 28, 278000],\n ['MEA', 38000, 12, 44000, 14, 52000, 17, 61000, 20, 195000],\n ];\n\n readonly gridSettings: GridSettings = {\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example2.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example3.ts.json index 521747982..04f89cc40 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n Select and copy cell B2\n  \n \n
\n
\n
\n \n
`\n ,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Update API docs', 'Backend', 'In progress', 'Ana García', '2026-05-10'],\n ['Deploy hotfix', 'DevOps', 'Done', 'David Kim', '2026-04-02'],\n ['Write tests', 'QA', 'Blocked', 'Sara Johansson', '2026-05-20'],\n ['Review PRs', 'Backend', 'In progress', 'Li Wei', '2026-04-15'],\n ['Update README', 'Docs', 'Done', 'Emma Wilson', '2026-03-28'],\n ];\n\n readonly gridSettings:GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n copyBtnClick(): void {\n document.execCommand('copy');\n }\n\n cutBtnClick(): void {\n document.execCommand('cut');\n }\n\n copyBtnMousedown(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.selectCell(1, 1);\n }\n\n cutBtnMousedown(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.selectCell(1, 1);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example3.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n Select and copy cell B2\n  \n \n
\n
\n
\n \n
`\n ,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Update API docs', 'Backend', 'In progress', 'Ana García', '2026-05-10'],\n ['Deploy hotfix', 'DevOps', 'Done', 'David Kim', '2026-04-02'],\n ['Write tests', 'QA', 'Blocked', 'Sara Johansson', '2026-05-20'],\n ['Review PRs', 'Backend', 'In progress', 'Li Wei', '2026-04-15'],\n ['Update README', 'Docs', 'Done', 'Emma Wilson', '2026-03-28'],\n ];\n\n readonly gridSettings:GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n copyBtnClick(): void {\n document.execCommand('copy');\n }\n\n cutBtnClick(): void {\n document.execCommand('cut');\n }\n\n copyBtnMousedown(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.selectCell(1, 1);\n }\n\n cutBtnMousedown(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.selectCell(1, 1);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example3.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example4.ts.json index b32e253c8..a1ef2ecf0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col)['className'] as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\n@Component({\n selector: 'example4-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n copiedClassNames: string[][] = [];\n\n readonly data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedClassNames = collectClassNames(this.hotTable.hotInstance!, coords);\n },\n afterCut: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedClassNames = collectClassNames(this.hotTable.hotInstance!, coords);\n },\n afterPaste: (_data: unknown[][], coords: CopyRange[]) => {\n const target = coords[0];\n const hot = this.hotTable.hotInstance!;\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n this.copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n hot.render();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example4.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col)['className'] as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\n@Component({\n selector: 'example4-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n copiedClassNames: string[][] = [];\n\n readonly data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedClassNames = collectClassNames(this.hotTable.hotInstance!, coords);\n },\n afterCut: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedClassNames = collectClassNames(this.hotTable.hotInstance!, coords);\n },\n afterPaste: (_data: unknown[][], coords: CopyRange[]) => {\n const target = coords[0];\n const hot = this.hotTable.hotInstance!;\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n this.copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n hot.render();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example4.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example5.ts.json index 0790a321f..a2aa8ffb7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\n@Component({\n selector: 'example5-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n copiedComments: (string | undefined)[][] = [];\n\n readonly data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedComments = collectComments(this.hotTable.hotInstance!, coords);\n },\n afterCut: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedComments = collectComments(this.hotTable.hotInstance!, coords);\n },\n afterPaste: (_data: unknown[][], coords: CopyRange[]) => {\n const target = coords[0];\n const hot = this.hotTable.hotInstance!;\n const comments = hot.getPlugin('comments');\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n this.copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n hot.render();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example5.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\n@Component({\n selector: 'example5-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n copiedComments: (string | undefined)[][] = [];\n\n readonly data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedComments = collectComments(this.hotTable.hotInstance!, coords);\n },\n afterCut: (_data: unknown[][], coords: CopyRange[]) => {\n this.copiedComments = collectComments(this.hotTable.hotInstance!, coords);\n },\n afterPaste: (_data: unknown[][], coords: CopyRange[]) => {\n const target = coords[0];\n const hot = this.hotTable.hotInstance!;\n const comments = hot.getPlugin('comments');\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n this.copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n hot.render();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example5.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example6.ts.json index 7f3803dc7..e587e905b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { PasteClipboardData } from 'handsontable/base';\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\n@Component({\n selector: 'example6-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse: (clipboardData: PasteClipboardData) => {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example6.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { PasteClipboardData } from 'handsontable/base';\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\n@Component({\n selector: 'example6-clipboard',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse: (clipboardData: PasteClipboardData) => {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/clipboard/angular/example6.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.js.json index 6c88c8e49..bbfa642d0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example1.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example1.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.ts.json index 889df22fa..34fd915cd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example1.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n rowHeaders: true,\n colHeaders: true,\n contextMenu: ['copy', 'cut'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example1.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.js.json index 749409ce1..b1dca8f3f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy with headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example2.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy with headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example2.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.ts.json index f8b21077c..5f392e9f6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy with headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example2.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy with headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n contextMenu: true,\n copyPaste: {\n copyColumnHeaders: true,\n copyColumnGroupHeaders: true,\n copyColumnHeadersOnly: true,\n },\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n [\n 'A',\n { label: 'B', colspan: 2 },\n { label: 'C', colspan: 2 },\n { label: 'D', colspan: 2 },\n { label: 'E', colspan: 2 },\n 'F',\n ],\n ['G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example2.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.js.json index a17c7837d..1b1cb4c91 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: true,\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst copyBtn = document.querySelector('#copy');\n\ncopyBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\ncopyBtn.addEventListener('click', () => {\n document.execCommand('copy');\n});\n\nconst cutBtn = document.querySelector('#cut');\n\ncutBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\ncutBtn.addEventListener('click', () => {\n document.execCommand('cut');\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example3.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: true,\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst copyBtn = document.querySelector('#copy');\n\ncopyBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\ncopyBtn.addEventListener('click', () => {\n document.execCommand('copy');\n});\n\nconst cutBtn = document.querySelector('#cut');\n\ncutBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\ncutBtn.addEventListener('click', () => {\n document.execCommand('cut');\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example3.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.ts.json index c647530fd..481741b55 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: true,\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst copyBtn = document.querySelector('#copy')!;\n\ncopyBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\n\ncopyBtn.addEventListener('click', () => {\n document.execCommand('copy');\n});\n\nconst cutBtn = document.querySelector('#cut')!;\n\ncutBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\n\ncutBtn.addEventListener('click', () => {\n document.execCommand('cut');\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example3.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n rowHeaders: true,\n colHeaders: true,\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ],\n outsideClickDeselects: false,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst copyBtn = document.querySelector('#copy')!;\n\ncopyBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\n\ncopyBtn.addEventListener('click', () => {\n document.execCommand('copy');\n});\n\nconst cutBtn = document.querySelector('#cut')!;\n\ncutBtn.addEventListener('mousedown', () => {\n hot.selectCell(1, 1);\n});\n\ncutBtn.addEventListener('click', () => {\n document.execCommand('cut');\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example3.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.js.json index bf3c6de18..fb200a772 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nlet copiedClassNames = [];\nfunction collectClassNames(hot, coords) {\n const source = coords[0];\n const classNames = [];\n if (!source) {\n return classNames;\n }\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames = [];\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push(hot.getCellMeta(row, col).className ?? '');\n }\n classNames.push(rowClassNames);\n }\n return classNames;\n}\nfunction applyClassNames(hot, coords) {\n const target = coords[0];\n if (!target) {\n return;\n }\n hot.batch(() => {\n copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n hot.render();\n}\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy(_data, coords) {\n copiedClassNames = collectClassNames(this, coords);\n },\n afterCut(_data, coords) {\n copiedClassNames = collectClassNames(this, coords);\n },\n afterPaste(_data, coords) {\n applyClassNames(this, coords);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example4.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nlet copiedClassNames = [];\nfunction collectClassNames(hot, coords) {\n const source = coords[0];\n const classNames = [];\n if (!source) {\n return classNames;\n }\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames = [];\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push(hot.getCellMeta(row, col).className ?? '');\n }\n classNames.push(rowClassNames);\n }\n return classNames;\n}\nfunction applyClassNames(hot, coords) {\n const target = coords[0];\n if (!target) {\n return;\n }\n hot.batch(() => {\n copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n hot.render();\n}\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy(_data, coords) {\n copiedClassNames = collectClassNames(this, coords);\n },\n afterCut(_data, coords) {\n copiedClassNames = collectClassNames(this, coords);\n },\n afterPaste(_data, coords) {\n applyClassNames(this, coords);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example4.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.ts.json index 61ef18409..8f241e61b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nlet copiedClassNames: string[][] = [];\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col).className as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\nfunction applyClassNames(hot: Handsontable, coords: CopyRange[]): void {\n const target = coords[0];\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n hot.render();\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy(_data, coords) {\n copiedClassNames = collectClassNames(this, coords as CopyRange[]);\n },\n afterCut(_data, coords) {\n copiedClassNames = collectClassNames(this, coords as CopyRange[]);\n },\n afterPaste(_data, coords) {\n applyClassNames(this, coords as CopyRange[]);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example4.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nlet copiedClassNames: string[][] = [];\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col).className as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\nfunction applyClassNames(hot: Handsontable, coords: CopyRange[]): void {\n const target = coords[0];\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n copiedClassNames.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n hot.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n hot.render();\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n cell: [\n { row: 0, col: 1, className: 'htRight' },\n { row: 0, col: 2, className: 'htCenter' },\n { row: 2, col: 1, className: 'htRight htDimmed' },\n { row: 2, col: 2, className: 'htCenter htDimmed' },\n ],\n afterCopy(_data, coords) {\n copiedClassNames = collectClassNames(this, coords as CopyRange[]);\n },\n afterCut(_data, coords) {\n copiedClassNames = collectClassNames(this, coords as CopyRange[]);\n },\n afterPaste(_data, coords) {\n applyClassNames(this, coords as CopyRange[]);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example4.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.js.json index ad7fe8e42..b62f226d4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nlet copiedComments = [];\nfunction collectComments(hot, coords) {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied = [];\n if (!source) {\n return copied;\n }\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments = [];\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n copied.push(rowComments);\n }\n return copied;\n}\nfunction applyComments(hot, coords) {\n const target = coords[0];\n const comments = hot.getPlugin('comments');\n if (!target) {\n return;\n }\n hot.batch(() => {\n copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n }\n else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n hot.render();\n}\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy(_data, coords) {\n copiedComments = collectComments(this, coords);\n },\n afterCut(_data, coords) {\n copiedComments = collectComments(this, coords);\n },\n afterPaste(_data, coords) {\n applyComments(this, coords);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example5.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nlet copiedComments = [];\nfunction collectComments(hot, coords) {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied = [];\n if (!source) {\n return copied;\n }\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments = [];\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n copied.push(rowComments);\n }\n return copied;\n}\nfunction applyComments(hot, coords) {\n const target = coords[0];\n const comments = hot.getPlugin('comments');\n if (!target) {\n return;\n }\n hot.batch(() => {\n copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n }\n else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n hot.render();\n}\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy(_data, coords) {\n copiedComments = collectComments(this, coords);\n },\n afterCut(_data, coords) {\n copiedComments = collectComments(this, coords);\n },\n afterPaste(_data, coords) {\n applyComments(this, coords);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example5.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.ts.json index 4f7298ee7..b18c53167 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nlet copiedComments: (string | undefined)[][] = [];\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\nfunction applyComments(hot: Handsontable, coords: CopyRange[]): void {\n const target = coords[0];\n const comments = hot.getPlugin('comments');\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n hot.render();\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy(_data, coords) {\n copiedComments = collectComments(this, coords as CopyRange[]);\n },\n afterCut(_data, coords) {\n copiedComments = collectComments(this, coords as CopyRange[]);\n },\n afterPaste(_data, coords) {\n applyComments(this, coords as CopyRange[]);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example5.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nlet copiedComments: (string | undefined)[][] = [];\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\nfunction applyComments(hot: Handsontable, coords: CopyRange[]): void {\n const target = coords[0];\n const comments = hot.getPlugin('comments');\n\n if (!target) {\n return;\n }\n\n hot.batch(() => {\n copiedComments.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n hot.render();\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n ],\n colHeaders: ['Product', 'Stock', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 0, col: 1, comment: { value: 'Counted during the July audit.' } },\n { row: 2, col: 1, comment: { value: 'Reorder request sent to Harbor Goods.' } },\n { row: 2, col: 2, comment: { value: 'Expected delivery is July 18.' } },\n ],\n afterCopy(_data, coords) {\n copiedComments = collectComments(this, coords as CopyRange[]);\n },\n afterCut(_data, coords) {\n copiedComments = collectComments(this, coords as CopyRange[]);\n },\n afterPaste(_data, coords) {\n applyComments(this, coords as CopyRange[]);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example5.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.js.json index f5bb102d4..d97719ce2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text) {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ],\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse(clipboardData) {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example6.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text) {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ],\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse(clipboardData) {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/clipboard/javascript/example6.js","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.ts.json index 4c11b10aa..fc41c0f83 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport type { PasteClipboardData } from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ],\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse(clipboardData: PasteClipboardData) {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example6.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport type { PasteClipboardData } from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n ],\n colHeaders: ['Product', 'Unit price', 'Stock'],\n columns: [{}, { type: 'numeric', numericFormat: { pattern: '0,0.00' } }, { type: 'numeric' }],\n rowHeaders: true,\n beforePasteParse(clipboardData: PasteClipboardData) {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/clipboard/javascript/example6.ts","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example1.tsx.json index 0260fa526..8a226c9dd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example1.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example1.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example2.tsx.json index 660aecfc8..31da195ea 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy with headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example2.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy with headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example2.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example3.tsx.json index 26854e6e1..0a1b96a9a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const copyBtnClickCallback = function () {\n document.execCommand('copy');\n };\n\n const cutBtnClickCallback = function () {\n document.execCommand('cut');\n };\n\n const copyBtnMousedownCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.selectCell(1, 1);\n };\n\n const cutBtnMousedownCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.selectCell(1, 1);\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example3.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const copyBtnClickCallback = function () {\n document.execCommand('copy');\n };\n\n const cutBtnClickCallback = function () {\n document.execCommand('cut');\n };\n\n const copyBtnMousedownCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.selectCell(1, 1);\n };\n\n const cutBtnMousedownCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.selectCell(1, 1);\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example3.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example4.tsx.json index 8c2d69bff..16d49a2af 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// register Handsontable's modules\nregisterAllModules();\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col).className as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\nconst data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n];\n\nconst ExampleComponent = () => {\n const copiedClassNames = useRef([]);\n\n return (\n {\n copiedClassNames.current.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n this.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n this.render();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example4.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// register Handsontable's modules\nregisterAllModules();\n\nfunction collectClassNames(hot: Handsontable, coords: CopyRange[]): string[][] {\n const source = coords[0];\n const classNames: string[][] = [];\n\n if (!source) {\n return classNames;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowClassNames: string[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowClassNames.push((hot.getCellMeta(row, col).className as string | undefined) ?? '');\n }\n\n classNames.push(rowClassNames);\n }\n\n return classNames;\n}\n\nconst data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n];\n\nconst ExampleComponent = () => {\n const copiedClassNames = useRef([]);\n\n return (\n {\n copiedClassNames.current.forEach((rowClassNames, rowOffset) => {\n rowClassNames.forEach((className, colOffset) => {\n this.setCellMeta(target.startRow + rowOffset, target.startCol + colOffset, 'className', className);\n });\n });\n });\n\n this.render();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example4.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example5.tsx.json index 2d7e05ab8..adaa91d70 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// register Handsontable's modules\nregisterAllModules();\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\nconst data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n];\n\nconst ExampleComponent = () => {\n const copiedComments = useRef<(string | undefined)[][]>([]);\n\n return (\n {\n copiedComments.current.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n this.render();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example5.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ntype CopyRange = { startRow: number; startCol: number; endRow: number; endCol: number };\n\n// register Handsontable's modules\nregisterAllModules();\n\nfunction collectComments(hot: Handsontable, coords: CopyRange[]): (string | undefined)[][] {\n const source = coords[0];\n const comments = hot.getPlugin('comments');\n const copied: (string | undefined)[][] = [];\n\n if (!source) {\n return copied;\n }\n\n for (let row = source.startRow; row <= source.endRow; row += 1) {\n const rowComments: (string | undefined)[] = [];\n\n for (let col = source.startCol; col <= source.endCol; col += 1) {\n rowComments.push(comments.getCommentAtCell(row, col));\n }\n\n copied.push(rowComments);\n }\n\n return copied;\n}\n\nconst data = [\n ['Wireless mouse', 142, 'In stock'],\n ['USB-C cable', 67, 'In stock'],\n ['Mechanical keyboard', 0, 'Backordered'],\n ['Laptop stand', 38, 'In stock'],\n ['HDMI adapter', 210, 'In stock'],\n];\n\nconst ExampleComponent = () => {\n const copiedComments = useRef<(string | undefined)[][]>([]);\n\n return (\n {\n copiedComments.current.forEach((rowComments, rowOffset) => {\n rowComments.forEach((comment, colOffset) => {\n const row = target.startRow + rowOffset;\n const col = target.startCol + colOffset;\n\n if (comment) {\n comments.setCommentAtCell(row, col, comment);\n } else {\n comments.removeCommentAtCell(row, col, false);\n }\n });\n });\n });\n\n this.render();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example5.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example6.tsx.json index 8f279cf93..717229c7f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport type { PasteClipboardData } from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nconst data = [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example6.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport type { PasteClipboardData } from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Convert \"1 234,50\" (space or non-breaking space as the thousands separator,\n// comma as the decimal separator) to \"1234.50\".\nfunction toPlainNumbers(text: string): string {\n return text.replace(/(\\d)[\\u00a0\\u202f ](?=\\d{3}\\b)/g, '$1').replace(/(\\d),(\\d)/g, '$1.$2');\n}\n\nconst data = [\n ['Wireless mouse', 24.9, 142],\n ['USB-C cable', 9.5, 67],\n ['Mechanical keyboard', 89, 0],\n ['Laptop stand', 45.25, 38],\n ['HDMI adapter', 12.75, 210],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n clipboardData.setData('text/plain', toPlainNumbers(clipboardData.getData('text/plain')));\n // A spreadsheet also puts a
in text/html, and it wins over text/plain.\n clipboardData.clearData('text/html');\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/clipboard/react/example6.tsx","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example1.vue.json index 36ac214f2..0a6a16724 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example1.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example1.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example2.vue.json index 7bfb14131..daca73554 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy with headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example2.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy with headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example2.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example2","exampleTitle":"Copy with headers","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example3.vue.json index 65de049db..099fe3975 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example3.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Trigger copy & cut programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example3.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example3","exampleTitle":"Trigger copy & cut programmatically","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example4.vue.json index 671db7be2..08bdb8fe6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example4.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy cell appearance on paste · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example4.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example4","exampleTitle":"Copy cell appearance on paste","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example5.vue.json index 015bf25ea..109f166ca 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example5.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Copy comments on paste · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example5.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example5","exampleTitle":"Copy comments on paste","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example6.vue.json index 8a30d1d68..301b5adf6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__clipboard__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example6.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Clipboard · Clean up pasted content before it is parsed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/clipboard/vue/example6.vue","breadcrumb":["Cell Features","Clipboard"],"guide":"guides/cell-features/clipboard/clipboard.md","guideTitle":"Clipboard","exampleId":"example6","exampleTitle":"Clean up pasted content before it is parsed","docPermalink":"/basic-clipboard","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example1.ts.json index 97879b16c..993d0a12f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example1.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example1.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example2.ts.json index 931be6609..e2d500b1c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Make a comment read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example2.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Make a comment read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example2.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example3.ts.json index 0ae396845..70cb02ebd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Set a comment box's size · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example3.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Set a comment box's size · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example3.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example4.ts.json index 6eb2f14f6..b51a98ea8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example4.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example4.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example5.ts.json index 36355895e..25d8e07ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value: any, callback: (valid: boolean) => void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(this: Handsontable, isValid: boolean, value: any, row: number, prop: string | number) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit(this: Handsontable) {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example5.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value: any, callback: (valid: boolean) => void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(this: Handsontable, isValid: boolean, value: any, row: number, prop: string | number) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit(this: Handsontable) {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example5.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example6.ts.json index 7b4c96a5b..b29c2cfec 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Comments · Read all comments programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
\n {{ output }}`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n listComments(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta['comment'] as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n this.output = found.length > 0 ? found.join('\\n') : 'No comments found.';\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example6.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Comments · Read all comments programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-comments',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
\n {{ output }}`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n listComments(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta['comment'] as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n this.output = found.length > 0 ? found.join('\\n') : 'No comments found.';\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/comments/angular/example6.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.js.json index 7317ff87b..d4dc0599d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example1.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example1.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.ts.json index 5298e1699..ef7d93110 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example1.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n { row: 2, col: 2, comment: { value: 'More comments' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example1.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.js.json index 70d4ff4ac..50f25f32c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Make a comment read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example2.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Make a comment read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example2.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.ts.json index e6b31a3c9..b6ffdf1db 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Make a comment read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example2.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Make a comment read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n {\n row: 0,\n col: 0,\n comment: { value: 'A read-only comment.', readOnly: true },\n },\n { row: 1, col: 0, comment: { value: 'You can edit this comment' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example2.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.js.json index 4d2660308..45862a1be 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Set a comment box's size · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example3.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Set a comment box's size · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example3.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.ts.json index deea69bbc..2441bd11e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Set a comment box's size · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example3.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Set a comment box's size · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: true,\n cell: [\n { row: 1, col: 1, comment: { value: 'Some comment' } },\n // add the `style` parameter\n {\n row: 2,\n col: 2,\n comment: {\n value: 'Comment 200x50 px',\n style: { width: 200, height: 50 },\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example3.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.js.json index 32c332c03..fb9af51b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example4.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example4.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.ts.json index 75c5d3692..7dcb4d766 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example4.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n rowHeaders: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n contextMenu: true,\n comments: {\n // on mouseover, wait 2 seconds before the comment box displays\n displayDelay: 2000,\n },\n cell: [{ row: 1, col: 1, comment: { value: 'Some comment' } }],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example4.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.js.json index 796821bc7..232ea2290 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ],\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value, callback) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(isValid, value, row, prop) {\n const column = this.propToCol(prop);\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n const comments = this.getPlugin('comments');\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n }\n else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit() {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example5.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ],\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value, callback) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(isValid, value, row, prop) {\n const column = this.propToCol(prop);\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n const comments = this.getPlugin('comments');\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n }\n else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit() {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example5.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.ts.json index 6a8464cb8..d357ec904 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ],\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value: any, callback: (valid: boolean) => void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(isValid, value, row, prop) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit() {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example5.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data: [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n ],\n colHeaders: ['Product', 'Stock'],\n rowHeaders: true,\n comments: true,\n columns: [\n {},\n {\n type: 'numeric',\n validator(value: any, callback: (valid: boolean) => void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ],\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate(isValid, value, row, prop) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n },\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit() {\n this.validateCells();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example5.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.js.json index 58c462317..ca577af54 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Comments · Read all comments programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nconst hot = new Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ],\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst button = document.querySelector('#list-comments');\nconst output = document.querySelector('#comments-output');\nbutton.addEventListener('click', () => {\n const found = [];\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment;\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n output.textContent = found.length > 0 ? found.join('\\n') : 'No comments found.';\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example6.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Comments · Read all comments programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nconst hot = new Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ],\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst button = document.querySelector('#list-comments');\nconst output = document.querySelector('#comments-output');\nbutton.addEventListener('click', () => {\n const found = [];\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment;\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n output.textContent = found.length > 0 ? found.join('\\n') : 'No comments found.';\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/comments/javascript/example6.js","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.ts.json index ee0aedba4..411f44a80 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Comments · Read all comments programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ],\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#list-comments')!;\nconst output = document.querySelector('#comments-output')!;\n\nbutton.addEventListener('click', () => {\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n output.textContent = found.length > 0 ? found.join('\\n') : 'No comments found.';\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example6.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Comments · Read all comments programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n ],\n colHeaders: ['Task', 'Assignee', 'Status'],\n rowHeaders: true,\n comments: true,\n cell: [\n { row: 1, col: 2, comment: { value: 'Waiting on infrastructure approval.' } },\n { row: 3, col: 1, comment: { value: 'Reassign if capacity is tight.' } },\n { row: 4, col: 0, comment: { value: 'Blocked on the security review.' } },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#list-comments')!;\nconst output = document.querySelector('#comments-output')!;\n\nbutton.addEventListener('click', () => {\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n output.textContent = found.length > 0 ? found.join('\\n') : 'No comments found.';\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/comments/javascript/example6.ts","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example1.tsx.json index 73f709112..a0f4ff590 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example1.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example1.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example2.tsx.json index 7daed4f95..046301cc2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Make a comment read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example2.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Make a comment read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example2.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example3.tsx.json index 1d0f93bca..ad81292f8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Set a comment box's size · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example3.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Set a comment box's size · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example3.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example4.tsx.json index 008523b6f..c8a626b92 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example4.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example4.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example5.tsx.json index 9a91695e1..7d3753611 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n];\n\nconst ExampleComponent = () => {\n return (\n void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ]}\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate={function (this: Handsontable, isValid, value, row, prop) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n }}\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit={function (this: Handsontable) {\n this.validateCells();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example5.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Wireless mouse', 142],\n ['USB-C cable', 67],\n ['Mechanical keyboard', -5],\n ['Laptop stand', 38],\n ['HDMI adapter', 210],\n];\n\nconst ExampleComponent = () => {\n return (\n void) {\n callback(Number.isInteger(value) && value >= 0);\n },\n },\n ]}\n // Attach a comment when a cell fails validation, and remove it once the cell is valid.\n afterValidate={function (this: Handsontable, isValid, value, row, prop) {\n const column = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const comments = this.getPlugin('comments');\n\n if (!isValid) {\n comments.setCommentAtCell(row, column, `\"${value}\" is not valid. Enter a whole number of 0 or more.`);\n } else {\n comments.removeCommentAtCell(row, column);\n }\n }}\n // Validate every cell on load so the pre-existing invalid value is flagged right away.\n afterInit={function (this: Handsontable) {\n this.validateCells();\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example5.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example6.tsx.json index ea4233e96..8bb7cb044 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Comments · Read all comments programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('');\n\n const listComments = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n setOutput(found.length > 0 ? found.join('\\n') : 'No comments found.');\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n {output}\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example6.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Comments · Read all comments programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Update API docs', 'Ana García', 'In progress'],\n ['Deploy hotfix', 'James Okafor', 'Blocked'],\n ['Review pull requests', 'Li Wei', 'Done'],\n ['Plan Q3 roadmap', 'Maria Santos', 'In progress'],\n ['Refactor auth module', 'David Kim', 'In review'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('');\n\n const listComments = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const found: string[] = [];\n\n // `getCellMetaAtRow()` takes a physical row index (equal to the visual index here, with no sorting or trimming).\n for (let row = 0; row < hot.countRows(); row += 1) {\n hot.getCellMetaAtRow(row).forEach((cellMeta, col) => {\n const comment = cellMeta.comment as { value?: string } | undefined;\n\n if (comment?.value !== undefined) {\n found.push(`Row ${row + 1}, \"${hot.getColHeader(col)}\": ${comment.value}`);\n }\n });\n }\n\n setOutput(found.length > 0 ? found.join('\\n') : 'No comments found.');\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n {output}\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/comments/react/example6.tsx","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example1.vue.json index 0fe99c867..a53721760 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example1.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example1.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example2.vue.json index a3a8978f6..f4c15665f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Make a comment read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example2.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Make a comment read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example2.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example2","exampleTitle":"Make a comment read-only","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example3.vue.json index 8737e3616..971a98a02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Set a comment box's size · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example3.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Set a comment box's size · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example3.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example3","exampleTitle":"Set a comment box's size","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example4.vue.json index f69e15593..0b5dea258 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example4.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Set a delay for displaying comments · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example4.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example4","exampleTitle":"Set a delay for displaying comments","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example5.vue.json index 39e2e5ef8..0ce25291e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example5.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Flag invalid cells with a comment · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example5.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example5","exampleTitle":"Flag invalid cells with a comment","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example6.vue.json index 29a8d0f5f..8a533f9cb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__comments__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Comments · Read all comments programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example6.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Comments · Read all comments programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/comments/vue/example6.vue","breadcrumb":["Cell Features","Comments"],"guide":"guides/cell-features/comments/comments.md","guideTitle":"Comments","exampleId":"example6","exampleTitle":"Read all comments programmatically","docPermalink":"/comments","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example1.ts.json index 9f68e12a5..2b178d496 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n@Component({\n selector: 'example1-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `example1-conditional-formatting .handsontable td.company-name {\n font-weight: 600;\n}\nexample1-conditional-formatting .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\nexample1-conditional-formatting .handsontable td.loss::before {\n content: \"▼ \";\n}\nexample1-conditional-formatting .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\nhtml[data-theme=\"dark\"] example1-conditional-formatting .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\nhtml[data-theme=\"dark\"] example1-conditional-formatting .handsontable td.strong-quarter {\n color: #22c55e;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row: number, col: number) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (col > 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example1.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n@Component({\n selector: 'example1-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `example1-conditional-formatting .handsontable td.company-name {\n font-weight: 600;\n}\nexample1-conditional-formatting .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\nexample1-conditional-formatting .handsontable td.loss::before {\n content: \"▼ \";\n}\nexample1-conditional-formatting .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\nhtml[data-theme=\"dark\"] example1-conditional-formatting .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\nhtml[data-theme=\"dark\"] example1-conditional-formatting .handsontable td.strong-quarter {\n color: #22c55e;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row: number, col: number) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (col > 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example1.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example2.ts.json index eca0d767a..bbf14636a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\n@Component({\n selector: 'example2-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `example2-conditional-formatting .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\nhtml[data-theme=\"dark\"] example2-conditional-formatting .handsontable td.loss-cell {\n color: #ff5c70;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example2.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\n@Component({\n selector: 'example2-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `example2-conditional-formatting .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\nhtml[data-theme=\"dark\"] example2-conditional-formatting .handsontable td.loss-cell {\n color: #ff5c70;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example2.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example3.ts.json index e56cc3cb2..616e6ac21 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\n@Component({\n selector: 'example3-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example3.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer = (\n instance: Handsontable,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\n@Component({\n selector: 'example3-conditional-formatting',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/conditional-formatting/angular/example3.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.js.json index 6f773a95f..2f89553e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row, col) {\n const cellProperties = {};\n if (col > 0) {\n cellProperties.className = '';\n const value = data[row]?.[col];\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n }\n else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n return cellProperties;\n },\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example1.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row, col) {\n const cellProperties = {};\n if (col > 0) {\n cellProperties.className = '';\n const value = data[row]?.[col];\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n }\n else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n return cellProperties;\n },\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example1.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.ts.json index 827b203e3..472f1c108 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row, col) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (col > 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n },\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example1.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n { className: 'company-name' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n { type: 'numeric' },\n ],\n cells(row, col) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (col > 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n },\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example1.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.js.json index dbd7c0106..81a287415 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n td.classList.remove('loss-cell');\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n return;\n }\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\nregisterRenderer('profitRenderer', profitRenderer);\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example2.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n td.classList.remove('loss-cell');\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n return;\n }\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\nregisterRenderer('profitRenderer', profitRenderer);\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example2.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.ts.json index ac0ef0c30..a68894d1b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example2.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n { renderer: 'profitRenderer' },\n ],\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example2.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.js.json index 4fe4cb431..e2a81bfcf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n const amount = Number(value);\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\nregisterRenderer('heatmapRenderer', heatmapRenderer);\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example3.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n const amount = Number(value);\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\nregisterRenderer('heatmapRenderer', heatmapRenderer);\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example3.js","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.ts.json index fa69969a8..ea0ad5177 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example3.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1', 'Q2', 'Q3', 'Q4'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n columns: [\n {},\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n { renderer: 'heatmapRenderer' },\n ],\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/conditional-formatting/javascript/example3.ts","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example1.tsx.json index 0df5d0017..eb49de25c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\nconst ExampleComponent = () => {\n return (\n 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/react/example1.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\nconst ExampleComponent = () => {\n return (\n 0) {\n cellProperties.className = '';\n\n const value = data[row]?.[col];\n\n if (typeof value === 'number' && value < 0) {\n cellProperties.className = 'loss';\n } else if (typeof value === 'number' && value > 10) {\n cellProperties.className = 'strong-quarter';\n }\n }\n\n return cellProperties;\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example1 .handsontable td.company-name {\n font-weight: 600;\n}\n\n#example1 .handsontable td.loss {\n color: #d81e2c;\n background: var(--ht-cell-error-background-color, rgba(216, 30, 44, 0.14));\n background: color-mix(in srgb, #d81e2c 16%, var(--ht-background-color, #ffffff));\n}\n\n#example1 .handsontable td.loss::before {\n content: \"▼ \";\n}\n\n#example1 .handsontable td.strong-quarter {\n color: #157a3d;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.loss {\n color: #ff5c70;\n background: color-mix(in srgb, #ff5c70 22%, var(--ht-background-color, #000000));\n}\n\nhtml[data-theme=\"dark\"] #example1 .handsontable td.strong-quarter {\n color: #22c55e;\n}"},"docsPath":"guides/cell-features/conditional-formatting/react/example1.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example2.tsx.json index 6f6516179..78450425b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/react/example2.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// display losses in an accounting format, so color is not the only signal\nconst profitRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n const amount = Number(value);\n\n td.classList.remove('loss-cell');\n\n if (!Number.isFinite(amount)) {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n return;\n }\n\n const formatted = amount < 0\n ? `($${Math.abs(amount).toFixed(1)}M)`\n : `$${amount.toFixed(1)}M`;\n\n textRenderer(instance, td, row, col, prop, formatted, cellProperties);\n\n if (amount < 0) {\n td.classList.add('loss-cell');\n }\n};\n\nregisterRenderer('profitRenderer', profitRenderer);\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example2 .handsontable td.loss-cell {\n color: #d81e2c;\n font-weight: 600;\n}\n\nhtml[data-theme=\"dark\"] #example2 .handsontable td.loss-cell {\n color: #ff5c70;\n}"},"docsPath":"guides/cell-features/conditional-formatting/react/example2.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example3.tsx.json index 2f047ad5a..3d8833c1d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/conditional-formatting/react/example3.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 4.2, 5.1, -1.3, 6.8],\n ['Vertex Industries', 12.5, 11.9, 13.2, 14],\n ['Harbor Analytics', -2.4, 0.8, 2.1, 3.5],\n ['Summit Logistics', 8.7, -3.2, 4.4, 5.9],\n ['Pioneer Foods', 1.1, 1.4, 0.9, -0.5],\n ['Meridian Retail', 6, 7.3, 8.1, 9.4],\n];\n\n// shade the background from red (low) to green (high); the value stays visible\nconst heatmapRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n textRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const amount = Number(value);\n\n if (Number.isFinite(amount)) {\n const values = instance.getData()\n .flatMap((rowData) => rowData.slice(1))\n .map(Number)\n .filter((cellValue) => Number.isFinite(cellValue));\n const min = Math.min(...values);\n const max = Math.max(...values);\n const ratio = min === max ? 0.5 : (amount - min) / (max - min);\n const hue = Math.round(ratio * 120);\n\n td.style.background = `hsl(${hue}, 75%, 85%)`;\n td.style.color = '#1b1b1b';\n }\n};\n\nregisterRenderer('heatmapRenderer', heatmapRenderer);\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/conditional-formatting/react/example3.tsx","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example1.vue.json index 78ed5715d..8babdd922 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example1.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example1.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/conditional-formatting","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example2.vue.json index 4fc0ddc20..610b12cda 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example2.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Format cells with a custom renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example2.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example2","exampleTitle":"Format cells with a custom renderer","docPermalink":"/conditional-formatting","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example3.vue.json index c35d839a0..d575c62bd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__conditional-formatting__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example3.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Conditional formatting · Build a color scale · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/conditional-formatting/vue/example3.vue","breadcrumb":["Cell Features","Conditional formatting"],"guide":"guides/cell-features/conditional-formatting/conditional-formatting.md","guideTitle":"Conditional formatting","exampleId":"example3","exampleTitle":"Build a color scale","docPermalink":"/conditional-formatting","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example1.ts.json index 2e7378758..4aa528aa2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `hot-table td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\nhot-table .custom-table thead th:nth-child(even),\nhot-table .custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example1.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n styles: `hot-table td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\nhot-table .custom-table thead th:nth-child(even),\nhot-table .custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example1.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example2.ts.json index d2dfd6cba..c2e6b76cf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterRenderer('customStylesRenderer', (hotInstance: Handsontable, TD: HTMLTableCellElement, row: number, col: number, prop: string | number, value: unknown, cellProperties: Handsontable.CellProperties) => {\n textRenderer(hotInstance, TD, row, col, prop, value, cellProperties);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n});\n\n@Component({\n selector: 'example2-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example2.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterRenderer('customStylesRenderer', (hotInstance: Handsontable, TD: HTMLTableCellElement, row: number, col: number, prop: string | number, value: unknown, cellProperties: Handsontable.CellProperties) => {\n textRenderer(hotInstance, TD, row, col, prop, value, cellProperties);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n});\n\n@Component({\n selector: 'example2-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example2.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example3.ts.json index 77391e525..f804062f4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterRenderer('customStylesRenderer', (hotInstance: Handsontable, TD: HTMLTableCellElement, row: number, col: number, prop: string | number, value: unknown, cellProperties: Handsontable.CellProperties) => {\n textRenderer(hotInstance, TD, row, col, prop, value, cellProperties);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n});\n\n@Component({\n selector: 'example3-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example3.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterRenderer('customStylesRenderer', (hotInstance: Handsontable, TD: HTMLTableCellElement, row: number, col: number, prop: string | number, value: unknown, cellProperties: Handsontable.CellProperties) => {\n textRenderer(hotInstance, TD, row, col, prop, value, cellProperties);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n});\n\n@Component({\n selector: 'example3-formatting-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/formatting-cells/angular/example3.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.js.json index 7314e1052..3ad5ef82f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/javascript/example1.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/javascript/example1.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.ts.json index df97a1597..21a40b71b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/javascript/example1.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n className: 'custom-table',\n cell: [\n {\n row: 0,\n col: 0,\n className: 'custom-cell',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/javascript/example1.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.js.json index d2cbb471f..4741c1211 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\n// register Handsontable's modules\nregisterAllModules();\nconst customStylesRenderer = (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n};\nregisterRenderer('customStylesRenderer', customStylesRenderer);\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example2.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\n// register Handsontable's modules\nregisterAllModules();\nconst customStylesRenderer = (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n};\nregisterRenderer('customStylesRenderer', customStylesRenderer);\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example2.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.ts.json index 16288f332..b042801d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst customStylesRenderer: BaseRenderer = (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n};\n\nregisterRenderer('customStylesRenderer', customStylesRenderer);\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example2.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst customStylesRenderer: BaseRenderer = (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n};\n\nregisterRenderer('customStylesRenderer', customStylesRenderer);\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n stretchH: 'all',\n cell: [\n {\n row: 0,\n col: 0,\n renderer: 'customStylesRenderer',\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example2.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.js.json index f602e7eac..8c8530c1c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n autoWrapRow: true,\n autoWrapCol: true,\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example3.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n autoWrapRow: true,\n autoWrapCol: true,\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example3.js","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.ts.json index 1777730c3..5314f4f09 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n autoWrapRow: true,\n autoWrapCol: true,\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example3.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n ],\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Category', 'Price ($)', 'Stock'],\n autoWrapRow: true,\n autoWrapCol: true,\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n customBorders: [\n {\n range: {\n from: {\n row: 1,\n col: 1,\n },\n to: {\n row: 3,\n col: 4,\n },\n },\n top: {\n width: 2,\n color: '#5292F7',\n style: 'dotted',\n },\n bottom: {\n width: 2,\n color: 'red',\n },\n start: {\n width: 2,\n color: 'orange',\n style: 'dashed',\n },\n end: {\n width: 2,\n color: 'magenta',\n },\n },\n {\n row: 2,\n col: 2,\n start: {\n width: 2,\n color: 'red',\n },\n end: {\n width: 1,\n color: 'green',\n },\n },\n ],\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/formatting-cells/javascript/example3.ts","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example1.tsx.json index b44aae8b8..09f583997 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/react/example1.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"td.custom-cell {\n color: #fff !important;\n background-color: #254ac6 !important;\n}\n.custom-table thead th:nth-child(even),\n.custom-table tbody tr:nth-child(odd) th {\n color: #fff !important;\n background-color: #254ac6 !important;\n}"},"docsPath":"guides/cell-features/formatting-cells/react/example1.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example2.tsx.json index 11d0917e9..95160118d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n registerRenderer('customStylesRenderer', (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/formatting-cells/react/example2.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer, registerRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n registerRenderer('customStylesRenderer', (hotInstance, TD, ...rest) => {\n textRenderer(hotInstance, TD, ...rest);\n\n TD.style.fontWeight = 'bold';\n TD.style.color = 'green';\n TD.style.background = '#d7f1e1';\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/formatting-cells/react/example2.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example3.tsx.json index bc85ebb5b..05d94a082 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/formatting-cells/react/example3.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Laptop Pro 15', 'Electronics', 149900, 42],\n ['SKU-0093', 'Wireless Mouse', 'Peripherals', 2999, 218],\n ['SKU-7712', 'USB-C Hub 7-port', 'Peripherals', 5499, 0],\n ['SKU-3305', 'Mech. Keyboard', 'Peripherals', 8999, 67],\n ['SKU-9140', '4K Monitor 27\"', 'Electronics', 34999, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/formatting-cells/react/example3.tsx","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example1.vue.json index dee37d97a..62b4bee03 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example1.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example1.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formatting-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example2.vue.json index 478cc4df1..e8c84d53b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example2.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Apply inline styles · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example2.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example2","exampleTitle":"Apply inline styles","docPermalink":"/formatting-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example3.vue.json index 7fe8af595..bc8a5f106 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__formatting-cells__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example3.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Formatting cells · Custom cell borders · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/formatting-cells/vue/example3.vue","breadcrumb":["Cell Features","Formatting cells"],"guide":"guides/cell-features/formatting-cells/formatting-cells.md","guideTitle":"Formatting cells","exampleId":"example3","exampleTitle":"Custom cell borders","docPermalink":"/formatting-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example1.ts.json index 8f474d88d..1ef717db9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example1.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example1.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example2.ts.json index 2c3d851d1..dd6474bd1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example2.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example2.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example3.ts.json index 64c6f227d..cee5dd7e4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { CellRange } from 'handsontable/base';\n\n@Component({\n selector: 'example3-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n {{\n output ||\n 'Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.'\n }}\n
\n \n
\n `,\n})\nexport class AppComponent {\n output = '';\n\n readonly data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells: (cellRange: CellRange) => {\n this.logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells: (\n cellRange: CellRange,\n mergeParent: { row: number; col: number; rowspan: number; colspan: number }\n ) => {\n this.logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells: (cellRange: CellRange) => {\n this.logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells: (cellRange: CellRange) => {\n this.logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n };\n\n private logEvent(message: string): void {\n this.output = `${message}\\n${this.output}`;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example3.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { CellRange } from 'handsontable/base';\n\n@Component({\n selector: 'example3-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n {{\n output ||\n 'Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.'\n }}\n
\n \n
\n `,\n})\nexport class AppComponent {\n output = '';\n\n readonly data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells: (cellRange: CellRange) => {\n this.logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells: (\n cellRange: CellRange,\n mergeParent: { row: number; col: number; rowspan: number; colspan: number }\n ) => {\n this.logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells: (cellRange: CellRange) => {\n this.logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells: (cellRange: CellRange) => {\n this.logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n };\n\n private logEvent(message: string): void {\n this.output = `${message}\\n${this.output}`;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example3.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example4.ts.json index 21855f4a3..3617eb509 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n
\n
\n
\n \n
\n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n mergeNoteRow(): void {\n this.hotTable?.hotInstance?.getPlugin('mergeCells').merge(5, 0, 5, 3);\n }\n\n unmergeNoteRow(): void {\n this.hotTable?.hotInstance?.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example4.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-merge-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n
\n
\n
\n \n
\n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n mergeNoteRow(): void {\n this.hotTable?.hotInstance?.getPlugin('mergeCells').merge(5, 0, 5, 3);\n }\n\n unmergeNoteRow(): void {\n this.hotTable?.hotInstance?.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/merge-cells/angular/example4.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.js.json index a63af6e89..af0b1096f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example1.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example1.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.ts.json index 14ee73894..f17310bd4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example1.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n height: 320,\n autoColumnSize: {\n allowSampleDuplicates: true,\n samplingRatio: 100,\n },\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n { row: 5, col: 6, rowspan: 3, colspan: 3 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example1.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.js.json index ee23cd692..27d211d6e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example2.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example2.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.ts.json index cde110903..c6466c890 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example2.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: {\n virtualized: true,\n cells: [{ row: 1, col: 1, rowspan: 3, colspan: 498 }],\n },\n viewportColumnRenderingOffset: 15,\n viewportColumnRenderingThreshold: 5,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example2.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.js.json index 8875da0ac..48e7e96e0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nconst output = document.querySelector('#example3-output');\nlet loggedText = '';\nconst logEvent = (message) => {\n loggedText = `${message}\\n${loggedText}`;\n output.innerText = loggedText;\n};\nnew Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells(cellRange) {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells(cellRange, mergeParent) {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells(cellRange) {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells(cellRange) {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example3.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nconst output = document.querySelector('#example3-output');\nlet loggedText = '';\nconst logEvent = (message) => {\n loggedText = `${message}\\n${loggedText}`;\n output.innerText = loggedText;\n};\nnew Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells(cellRange) {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells(cellRange, mergeParent) {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells(cellRange) {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells(cellRange) {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example3.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.ts.json index 1a274109b..61b0bf67c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\nconst output = document.querySelector('#example3-output') as HTMLElement;\n\nlet loggedText = '';\n\nconst logEvent = (message: string) => {\n loggedText = `${message}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nnew Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells(cellRange) {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells(cellRange, mergeParent) {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells(cellRange) {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells(cellRange) {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example3.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\nconst output = document.querySelector('#example3-output') as HTMLElement;\n\nlet loggedText = '';\n\nconst logEvent = (message: string) => {\n loggedText = `${message}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nnew Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n beforeMergeCells(cellRange) {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterMergeCells(cellRange, mergeParent) {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n },\n beforeUnmergeCells(cellRange) {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n afterUnmergeCells(cellRange) {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example3.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.js.json index fcc4498cd..017dc95fc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nconst mergeButton = document.querySelector('#example4-merge');\nconst unmergeButton = document.querySelector('#example4-unmerge');\nconst hot = new Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').merge(5, 0, 5, 3);\n});\nunmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example4.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nconst mergeButton = document.querySelector('#example4-merge');\nconst unmergeButton = document.querySelector('#example4-unmerge');\nconst hot = new Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').merge(5, 0, 5, 3);\n});\nunmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example4.js","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.ts.json index 473c2c9f6..19ae47169 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst mergeButton = document.querySelector('#example4-merge')!;\nconst unmergeButton = document.querySelector('#example4-unmerge')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').merge(5, 0, 5, 3);\n});\n\nunmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example4.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst mergeButton = document.querySelector('#example4-merge')!;\nconst unmergeButton = document.querySelector('#example4-unmerge')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n ],\n colHeaders: ['Region', 'Jan 2025', 'Feb 2025', 'Mar 2025'],\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n mergeCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').merge(5, 0, 5, 3);\n});\n\nunmergeButton.addEventListener('click', () => {\n hot.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/merge-cells/javascript/example4.ts","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example1.tsx.json index a4408e9b4..3ae752c23 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Merge cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example1.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Merge cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example1.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example2.tsx.json index a2bce8445..2a1f64f47 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example2.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(50) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(500) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example2.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example3.tsx.json index 0da129ff4..013758ba7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('');\n\n const logEvent = (message: string) => {\n setOutput((previousOutput) => `${message}\\n${previousOutput}`);\n };\n\n return (\n <>\n \n {output ||\n 'Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.'}\n \n {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n afterMergeCells={(cellRange, mergeParent) => {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n }}\n beforeUnmergeCells={(cellRange) => {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n afterUnmergeCells={(cellRange) => {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example3.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('');\n\n const logEvent = (message: string) => {\n setOutput((previousOutput) => `${message}\\n${previousOutput}`);\n };\n\n return (\n <>\n \n {output ||\n 'Select cells, then press Ctrl+M (or use the context menu) to merge or unmerge them. Hook activity appears here.'}\n \n {\n logEvent(`beforeMergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n afterMergeCells={(cellRange, mergeParent) => {\n logEvent(`afterMergeCells: merged into ${mergeParent.rowspan} row(s) by ${mergeParent.colspan} column(s).`);\n }}\n beforeUnmergeCells={(cellRange) => {\n logEvent(`beforeUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n afterUnmergeCells={(cellRange) => {\n logEvent(`afterUnmergeCells: rows ${cellRange.from.row}-${cellRange.to.row}, columns ${cellRange.from.col}-${cellRange.to.col}.`);\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example3.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example4.tsx.json index c24c82aac..6851d7863 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const mergeNoteRow = () => {\n hotRef.current?.hotInstance?.getPlugin('mergeCells').merge(5, 0, 5, 3);\n };\n\n const unmergeNoteRow = () => {\n hotRef.current?.hotInstance?.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example4.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 420000, 465000, 501000],\n ['Europe', 388000, 402000, 411000],\n ['APAC', 275000, 298000, 312000],\n ['Latin America', 142000, 151000, 158000],\n ['Middle East', 96000, 101000, 108000],\n ['Note: Q1 totals include a one-time currency adjustment.', null, null, null],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const mergeNoteRow = () => {\n hotRef.current?.hotInstance?.getPlugin('mergeCells').merge(5, 0, 5, 3);\n };\n\n const unmergeNoteRow = () => {\n hotRef.current?.hotInstance?.getPlugin('mergeCells').unmerge(5, 0, 5, 3);\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/merge-cells/react/example4.tsx","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example1.vue.json index 8641526aa..d5bb179a7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example1.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example1.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/merge-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example2.vue.json index df98d3e97..63cee9494 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example2.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Optimizing rendering of the wide/tall merged cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example2.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example2","exampleTitle":"Optimizing rendering of the wide/tall merged cells","docPermalink":"/merge-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example3.vue.json index acdb5063c..a1413cf19 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example3.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Merge cells · React to merge and unmerge events · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example3.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example3","exampleTitle":"React to merge and unmerge events","docPermalink":"/merge-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example4.vue.json index 004d381f3..5f98dbee3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__merge-cells__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example4.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Merge cells · Merge and unmerge cells programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/merge-cells/vue/example4.vue","breadcrumb":["Cell Features","Merge cells"],"guide":"guides/cell-features/merge-cells/merge-cells.md","guideTitle":"Merge cells","exampleId":"example4","exampleTitle":"Merge and unmerge cells programmatically","docPermalink":"/merge-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__angular__example1.ts.json index d3661cc80..73eab629b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Move cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-move-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit(): void {\n // Pre-select an interior range so the move border is immediately discoverable.\n this.hotTable?.hotInstance?.selectCell(1, 1, 3, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/move-cells/angular/example1.ts","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Move cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-move-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit(): void {\n // Pre-select an interior range so the move border is immediately discoverable.\n this.hotTable?.hotInstance?.selectCell(1, 1, 3, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/move-cells/angular/example1.ts","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.js.json index 1a6113fa6..c88317767 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Move cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Pre-select an interior range so the move border is immediately discoverable.\nhot.selectCell(1, 1, 3, 3);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/move-cells/javascript/example1.js","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Move cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Pre-select an interior range so the move border is immediately discoverable.\nhot.selectCell(1, 1, 3, 3);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/move-cells/javascript/example1.js","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.ts.json index c98933c13..7bc2a843c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Move cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Pre-select an interior range so the move border is immediately discoverable.\nhot.selectCell(1, 1, 3, 3);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/move-cells/javascript/example1.ts","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Move cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n moveCells: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Pre-select an interior range so the move border is immediately discoverable.\nhot.selectCell(1, 1, 3, 3);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/move-cells/javascript/example1.ts","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__react__example1.tsx.json index 38d7bde1a..6fdd0c17d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Move cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n // Pre-select an interior range so the move border is immediately discoverable.\n useEffect(() => {\n hotRef.current?.hotInstance?.selectCell(1, 1, 3, 3);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/move-cells/react/example1.tsx","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Move cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n // Pre-select an interior range so the move border is immediately discoverable.\n useEffect(() => {\n hotRef.current?.hotInstance?.selectCell(1, 1, 3, 3);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/move-cells/react/example1.tsx","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__vue__example1.vue.json index ab14e207f..b350ce273 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__move-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Move cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/move-cells/vue/example1.vue","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Move cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/move-cells/vue/example1.vue","breadcrumb":["Cell Features","Move cells"],"guide":"guides/cell-features/move-cells/move-cells.md","guideTitle":"Move cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/move-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example1.ts.json index 53c0bbee5..18fef93b4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\n@Component({\n selector: 'example1-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example1.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\n@Component({\n selector: 'example1-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example1.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example2.ts.json index 41bc56d5a..fe92b07df 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings ={\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row: number, col: number, _: any) => {\n if (hot.getData()[row][col] === 'Helium') {\n return { readOnly: true };\n }\n\n return {};\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example2.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings ={\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row: number, col: number, _: any) => {\n if (hot.getData()[row][col] === 'Helium') {\n return { readOnly: true };\n }\n\n return {};\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example2.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example3.ts.json index 9ee41680b..a484fa784 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\n@Component({\n selector: 'example3-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example3.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\n@Component({\n selector: 'example3-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example3.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example4.ts.json index a7748f437..0bc7e5d44 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row, _col, prop) => {\n if (hot.getDataAtRowProp(row, prop as string) === 'Helium') {\n return { editor: false };\n }\n return { editor: 'text' };\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example4.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row, _col, prop) => {\n if (hot.getDataAtRowProp(row, prop as string) === 'Helium') {\n return { editor: false };\n }\n return { editor: 'text' };\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example4.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example5.ts.json index 458f7c829..4d943efbe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings ={\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row: number) => {\n return row === 1 ? { readOnly: true } : {};\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example5.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-read-only-cells',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings ={\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n cells: (row: number) => {\n return row === 1 ? { readOnly: true } : {};\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/example5.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__exampleReadOnlyGrid.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__exampleReadOnlyGrid.ts.json index c88b2517b..612f6b341 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__exampleReadOnlyGrid.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__angular__exampleReadOnlyGrid.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-readonly-grid',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n readOnly: true,\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/exampleReadOnlyGrid.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-readonly-grid',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ];\n\n readonly gridSettings: GridSettings = {\n readOnly: true,\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/read-only-cells/angular/exampleReadOnlyGrid.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.js.json index e3cfb673c..c183869db 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst dimmedTextRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example1.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst dimmedTextRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example1.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.ts.json index 61577d88a..20e19db4e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example1.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n readOnly: true,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n },\n {\n data: 'atomicNumber',\n },\n {\n data: 'atomicMass',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example1.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.js.json index 5decd4f49..8461d9f21 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, col) {\n return hot.getData()[row][col] === 'Helium' ? { readOnly: true } : {};\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example2.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, col) {\n return hot.getData()[row][col] === 'Helium' ? { readOnly: true } : {};\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example2.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.ts.json index edb5d46e6..9660653f3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, col) {\n return hot.getData()[row][col] === 'Helium' ? { readOnly: true } : {};\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example2.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, col) {\n return hot.getData()[row][col] === 'Helium' ? { readOnly: true } : {};\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example2.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.js.json index 7ba0ab113..a35ce8008 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nconst dimmedTextRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example3.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nconst dimmedTextRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example3.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.ts.json index 9147c357e..385d5598f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example3.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n {\n data: 'name',\n editor: false,\n renderer: dimmedTextRenderer,\n },\n {\n data: 'symbol',\n editor: 'text',\n },\n {\n data: 'atomicNumber',\n editor: 'numeric',\n },\n {\n data: 'atomicMass',\n editor: 'numeric',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example3.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.js.json index 31ba85087..0149eb813 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, _col, prop) {\n return hot.getDataAtRowProp(row, prop) === 'Helium' ? { editor: false } : { editor: 'text' };\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example4.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, _col, prop) {\n return hot.getDataAtRowProp(row, prop) === 'Helium' ? { editor: false } : { editor: 'text' };\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example4.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.ts.json index bcf22983b..ccd3d85d0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, _col, prop) {\n return hot.getDataAtRowProp(row, prop as string) === 'Helium' ? { editor: false } : { editor: 'text' };\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example4.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row, _col, prop) {\n return hot.getDataAtRowProp(row, prop as string) === 'Helium' ? { editor: false } : { editor: 'text' };\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example4.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.js.json index 23f4d8aa5..f7901489a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example5.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example5.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.ts.json index e7cfca812..c199c033d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example5.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst hot = new Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/example5.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.js.json index 862801b96..ebb285a2c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleReadOnlyGrid');\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n // make the entire grid read-only\n readOnly: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/exampleReadOnlyGrid.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleReadOnlyGrid');\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n // make the entire grid read-only\n readOnly: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/exampleReadOnlyGrid.js","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.ts.json index 5e9d590a5..e9fcc4bf0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__javascript__exampleReadOnlyGrid.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleReadOnlyGrid')!;\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n // make the entire grid read-only\n readOnly: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/exampleReadOnlyGrid.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleReadOnlyGrid')!;\n\nnew Handsontable(container, {\n data: [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n ],\n height: 'auto',\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n licenseKey: 'non-commercial-and-evaluation',\n // make the entire grid read-only\n readOnly: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/read-only-cells/javascript/exampleReadOnlyGrid.ts","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example1.tsx.json index 0ce74c877..0689d852c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example1.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example1.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example2.tsx.json index 34f2f6a41..ad02faf68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row, col) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (hot.getData()[row][col] === 'Helium') {\n cellProperties.readOnly = true;\n }\n\n return cellProperties;\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example2.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row, col) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (hot.getData()[row][col] === 'Helium') {\n cellProperties.readOnly = true;\n }\n\n return cellProperties;\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example2.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example3.tsx.json index d10af496e..767b6d12a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example3.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst dimmedTextRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.opacity = '0.6';\n};\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example3.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example4.tsx.json index 0c3099553..a466a2a83 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row, _col, prop) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (hot.getDataAtRowProp(row, prop as string) === 'Helium') {\n cellProperties.editor = false;\n } else {\n cellProperties.editor = 'text';\n }\n\n return cellProperties;\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example4.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row, _col, prop) {\n const cellProperties: Handsontable.CellMeta = {};\n\n if (hot.getDataAtRowProp(row, prop as string) === 'Helium') {\n cellProperties.editor = false;\n } else {\n cellProperties.editor = 'text';\n }\n\n return cellProperties;\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example4.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example5.tsx.json index 5d9ccbc03..1a3dca4ad 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example5.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n cells(row) {\n return row === 1 ? { readOnly: true } : {};\n },\n });\n });\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/example5.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__exampleReadOnlyGrid.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__exampleReadOnlyGrid.tsx.json index c60394525..62328d63b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__exampleReadOnlyGrid.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__react__exampleReadOnlyGrid.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleReadOnlyGrid\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/exampleReadOnlyGrid.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleReadOnlyGrid\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { name: 'Hydrogen', symbol: 'H', atomicNumber: 1, atomicMass: 1.008 },\n { name: 'Helium', symbol: 'He', atomicNumber: 2, atomicMass: 4.003 },\n { name: 'Lithium', symbol: 'Li', atomicNumber: 3, atomicMass: 6.94 },\n { name: 'Beryllium', symbol: 'Be', atomicNumber: 4, atomicMass: 9.012 },\n { name: 'Boron', symbol: 'B', atomicNumber: 5, atomicMass: 10.81 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/read-only-cells/react/exampleReadOnlyGrid.tsx","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example1.vue.json index d9e2b4554..b4b944609 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example1.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example1.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example2.vue.json index 46429c93d..6e3589859 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example2.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make specific cells read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example2.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example2","exampleTitle":"Make specific cells read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example3.vue.json index 9f6157dfb..2c3647372 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example3.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make a column non-editable · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example3.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example3","exampleTitle":"Make a column non-editable","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example4.vue.json index 83b09aafc..4ad40124e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example4.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make specific cells non-editable · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example4.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example4","exampleTitle":"Make specific cells non-editable","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example5.vue.json index 3fcb50b0b..58ea662ed 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example5.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make a row read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/example5.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"example5","exampleTitle":"Make a row read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__exampleReadOnlyGrid.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__exampleReadOnlyGrid.vue.json index 796dd21ec..b66edfab4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__exampleReadOnlyGrid.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__read-only-cells__vue__exampleReadOnlyGrid.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleReadOnlyGrid\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/exampleReadOnlyGrid.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Read-only cells · Make the grid read-only · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleReadOnlyGrid\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/read-only-cells/vue/exampleReadOnlyGrid.vue","breadcrumb":["Cell Features","Read-only cells"],"guide":"guides/cell-features/read-only-cells/read-only-cells.md","guideTitle":"Read-only cells","exampleId":"exampleReadOnlyGrid","exampleTitle":"Make the grid read-only","docPermalink":"/read-only-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example1.ts.json index 289d6df08..5e4b2b5e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of options; track opt.value) {\n \n {{ opt.label }}\n \n }\n
\n }\n
\n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n selected = 'multiple';\n\n readonly options = [\n { value: 'single', label: 'Single selection' },\n { value: 'range', label: 'Range selection' },\n { value: 'multiple', label: 'Multiple ranges selection' },\n ];\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal','F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n get selectedLabel(): string {\n return this.options.find((o) => o.value === this.selected)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectOption(value: string): void {\n this.selected = value;\n this.isOpen = false;\n type selection = 'multiple' | 'single' | 'range' | undefined;\n\n this.hotTable?.hotInstance?.updateSettings({ selectionMode: value as selection });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example1.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of options; track opt.value) {\n \n {{ opt.label }}\n \n }\n
\n }\n
\n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n selected = 'multiple';\n\n readonly options = [\n { value: 'single', label: 'Single selection' },\n { value: 'range', label: 'Range selection' },\n { value: 'multiple', label: 'Multiple ranges selection' },\n ];\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal','F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n get selectedLabel(): string {\n return this.options.find((o) => o.value === this.selected)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectOption(value: string): void {\n this.selected = value;\n this.isOpen = false;\n type selection = 'multiple' | 'single' | 'range' | undefined;\n\n this.hotTable?.hotInstance?.updateSettings({ selectionMode: value as selection });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example1.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example2.ts.json index ae98bcd66..ae9d0d55c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example2-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n @if (output) {\n {{ output }} \n }\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal','F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n getButtonClick(): void {\n const hot = this.hotTable?.hotInstance;\n const selected = hot?.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot?.getData(...selected[0]!) || [];\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n const item = selected[i];\n\n data.push(hot?.getData(...item));\n }\n }\n\n this.output = JSON.stringify(data);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example2.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example2-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n @if (output) {\n {{ output }} \n }\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal','F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n getButtonClick(): void {\n const hot = this.hotTable?.hotInstance;\n const selected = hot?.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot?.getData(...selected[0]!) || [];\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n const item = selected[i];\n\n data.push(hot?.getData(...item));\n }\n }\n\n this.output = JSON.stringify(data);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example2.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example3.ts.json index 2453fb542..5d0d300c8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Modify the selected cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal', 'F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n buttonClick(): void {\n const hot = this.hotTable?.hotInstance;\n const selected = hot?.getSelected() || [];\n\n hot?.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (\n let columnIndex = startCol;\n columnIndex <= endCol;\n columnIndex += 1\n ) {\n hot?.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot?.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot?.render();\n hot?.resumeRender();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example3.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Modify the selected cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import {Component, ViewChild, ViewEncapsulation} from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal', 'F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 'Egypt', 'M', 10, '2026-06-30'],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 'Sweden', 'F', 6, '2026-09-12'],\n ['Carlos Mendez', 'Sales', 'Account Manager', 74000, 'Mexico City', 'Mexico', 'M', 4, '2026-04-25'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output = '';\n\n buttonClick(): void {\n const hot = this.hotTable?.hotInstance;\n const selected = hot?.getSelected() || [];\n\n hot?.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (\n let columnIndex = startCol;\n columnIndex <= endCol;\n columnIndex += 1\n ) {\n hot?.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot?.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot?.render();\n hot?.resumeRender();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example3.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example4.ts.json index 1c9864448..30200b31c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Style the selection area · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-selection',\n standalone: true,\n imports: [HotTableModule],\n styles: [`\n #example4 td.area { background-color: rgba(75, 137, 255, 0.2); }\n #example4 td.area.area-1 { background-color: rgba(75, 137, 255, 0.4); }\n #example4 td.area.area-2 { background-color: rgba(75, 137, 255, 0.6); }\n `],\n template: `
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal', 'F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example4.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Style the selection area · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-selection',\n standalone: true,\n imports: [HotTableModule],\n styles: [`\n #example4 td.area { background-color: rgba(75, 137, 255, 0.2); }\n #example4 td.area.area-1 { background-color: rgba(75, 137, 255, 0.4); }\n #example4 td.area.area-2 { background-color: rgba(75, 137, 255, 0.6); }\n `],\n template: `
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 'Spain', 'F', 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 'Nigeria', 'M', 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 'China', 'M', 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 'Portugal', 'F', 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 'Korea', 'M', 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 'UK', 'F', 2, '2026-02-14'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example4.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example5.ts.json index a0c23b3a0..8cece38e2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Select cells programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 2, '2026-02-14'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n selectCell(): void {\n // Select a single cell: row 1, col 1 (B2)\n this.hotTable?.hotInstance?.selectCell(1, 1);\n }\n\n selectRange(): void {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n this.hotTable?.hotInstance?.selectCell(1, 1, 3, 3);\n }\n\n deselect(): void {\n this.hotTable?.hotInstance?.deselectCell();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example5.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Select cells programmatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n \n \n \n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 12, '2026-03-14'],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 8, '2026-07-01'],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 5, '2026-01-10'],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 3, '2026-11-20'],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 7, '2026-08-05'],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 2, '2026-02-14'],\n ];\n\n readonly gridSettings: GridSettings = {\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n selectCell(): void {\n // Select a single cell: row 1, col 1 (B2)\n this.hotTable?.hotInstance?.selectCell(1, 1);\n }\n\n selectRange(): void {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n this.hotTable?.hotInstance?.selectCell(1, 1, 3, 3);\n }\n\n deselect(): void {\n this.hotTable?.hotInstance?.deselectCell();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example5.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example6.ts.json index 4b82de73d..7a5868ea8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n \n
\n

\n Select a cell, then press Tab or → at the end of a row, or Enter or\n ↓ at the bottom of a column, to see the effect.\n

\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n toggleAutoWrapRow(event: Event): void {\n this.hotTable?.hotInstance?.updateSettings({ autoWrapRow: (event.target as HTMLInputElement).checked });\n }\n\n toggleAutoWrapCol(event: Event): void {\n this.hotTable?.hotInstance?.updateSettings({ autoWrapCol: (event.target as HTMLInputElement).checked });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example6.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n \n
\n

\n Select a cell, then press Tab or → at the end of a row, or Enter or\n ↓ at the bottom of a column, to see the effect.\n

\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n toggleAutoWrapRow(event: Event): void {\n this.hotTable?.hotInstance?.updateSettings({ autoWrapRow: (event.target as HTMLInputElement).checked });\n }\n\n toggleAutoWrapCol(event: Event): void {\n this.hotTable?.hotInstance?.updateSettings({ autoWrapCol: (event.target as HTMLInputElement).checked });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example6.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example7.ts.json index c62e84368..c246f0dcd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Selection · Resize a selection with handles · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example7-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit(): void {\n // Pre-select an interior range so the handles are immediately visible.\n this.hotTable?.hotInstance?.selectCell(1, 1, 4, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example7.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Selection · Resize a selection with handles · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example7-selection',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit(): void {\n // Pre-select an interior range so the handles are immediately visible.\n this.hotTable?.hotInstance?.selectCell(1, 1, 4, 3);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/selection/angular/example7.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.js.json index e4edc5f33..03d9a7e2f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dropdown = document.querySelector('#selectionDropdown');\nconst trigger = document.querySelector('#selectionTrigger');\nconst menu = document.querySelector('#selectionMenu');\nconst label = document.querySelector('#selectionLabel');\n\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ selectionMode: item.dataset.value });\n }\n});\n\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example1 {\n z-index: 1;\n position: relative;\n}"},"docsPath":"guides/cell-features/selection/javascript/example1.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dropdown = document.querySelector('#selectionDropdown');\nconst trigger = document.querySelector('#selectionTrigger');\nconst menu = document.querySelector('#selectionMenu');\nconst label = document.querySelector('#selectionLabel');\n\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ selectionMode: item.dataset.value });\n }\n});\n\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#example1 {\n z-index: 1;\n position: relative;\n}"},"docsPath":"guides/cell-features/selection/javascript/example1.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.ts.json index 84f884ed8..f23d004a4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dropdown = document.querySelector('#selectionDropdown')!;\nconst trigger = document.querySelector('#selectionTrigger')! as HTMLButtonElement;\nconst menu = document.querySelector('#selectionMenu')! as HTMLUListElement;\nconst label = document.querySelector('#selectionLabel')!;\n\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\nmenu.addEventListener('click', (e: MouseEvent) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ selectionMode: item.dataset.value } as Handsontable.GridSettings);\n }\n});\n\ndocument.addEventListener('click', (e: MouseEvent) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\ndocument.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example1 {\n z-index: 1;\n position: relative;\n}"},"docsPath":"guides/cell-features/selection/javascript/example1.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dropdown = document.querySelector('#selectionDropdown')!;\nconst trigger = document.querySelector('#selectionTrigger')! as HTMLButtonElement;\nconst menu = document.querySelector('#selectionMenu')! as HTMLUListElement;\nconst label = document.querySelector('#selectionLabel')!;\n\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\nmenu.addEventListener('click', (e: MouseEvent) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ selectionMode: item.dataset.value } as Handsontable.GridSettings);\n }\n});\n\ndocument.addEventListener('click', (e: MouseEvent) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\ndocument.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#example1 {\n z-index: 1;\n position: relative;\n}"},"docsPath":"guides/cell-features/selection/javascript/example1.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.js.json index c458fa493..1048d525c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n Here you will see the log\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst getButton = document.querySelector('#getButton');\nconst output = document.querySelector('#output');\n\ngetButton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n let data = [];\n\n if (selected.length === 1) {\n data = hot.getData(...selected[0]);\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n data.push(hot.getData(...selected[i]));\n }\n }\n\n output.innerText = JSON.stringify(data);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example2.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n Here you will see the log\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst getButton = document.querySelector('#getButton');\nconst output = document.querySelector('#output');\n\ngetButton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n let data = [];\n\n if (selected.length === 1) {\n data = hot.getData(...selected[0]);\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n data.push(hot.getData(...selected[i]));\n }\n }\n\n output.innerText = JSON.stringify(data);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example2.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.ts.json index b43a42d1f..b91e0ede8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n Here you will see the log\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst getButton = document.querySelector('#getButton')!;\nconst output = document.querySelector('#output')!;\n\ngetButton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot.getData(...selected[0]!);\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n data.push(hot.getData(...selected[i]!));\n }\n }\n\n (output as HTMLElement).innerText = JSON.stringify(data);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example2.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n Here you will see the log\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst getButton = document.querySelector('#getButton')!;\nconst output = document.querySelector('#output')!;\n\ngetButton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot.getData(...selected[0]!);\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n data.push(hot.getData(...selected[i]!));\n }\n }\n\n (output as HTMLElement).innerText = JSON.stringify(data);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example2.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.js.json index b607fe43b..72f6d3ed4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Modify the selected cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#set-data-action');\n\nbutton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n\n hot.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot.render();\n hot.resumeRender();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/javascript/example3.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Modify the selected cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#set-data-action');\n\nbutton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n\n hot.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot.render();\n hot.resumeRender();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/javascript/example3.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.ts.json index 52fd33675..59c743ab1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Modify the selected cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#set-data-action')!;\n\nbutton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n\n hot.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index]!;\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot.render();\n hot.resumeRender();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/javascript/example3.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Modify the selected cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple', // 'single', 'range' or 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst button = document.querySelector('#set-data-action')!;\n\nbutton.addEventListener('click', () => {\n const selected = hot.getSelected() || [];\n\n hot.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index]!;\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot.render();\n hot.resumeRender();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/javascript/example3.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.js.json index 4bac0de63..710ae7038 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Style the selection area · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/javascript/example4.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Style the selection area · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/javascript/example4.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.ts.json index ece148eb3..3fd952d9c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Style the selection area · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/javascript/example4.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Style the selection area · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n selectionMode: 'multiple',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/javascript/example4.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.js.json index 2ea5d5d37..67d7412ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Select cells programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ndocument.querySelector('#select-cell').addEventListener('click', () => {\n // Select a single cell: row 1, col 1 (B2)\n hot.selectCell(1, 1);\n});\ndocument.querySelector('#select-range').addEventListener('click', () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hot.selectCell(1, 1, 3, 3);\n});\ndocument.querySelector('#deselect').addEventListener('click', () => {\n hot.deselectCell();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example5.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Select cells programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ndocument.querySelector('#select-cell').addEventListener('click', () => {\n // Select a single cell: row 1, col 1 (B2)\n hot.selectCell(1, 1);\n});\ndocument.querySelector('#select-range').addEventListener('click', () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hot.selectCell(1, 1, 3, 3);\n});\ndocument.querySelector('#deselect').addEventListener('click', () => {\n hot.deselectCell();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example5.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.ts.json index 0945a16b4..9dd8a46ab 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Select cells programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ndocument.querySelector('#select-cell')!.addEventListener('click', () => {\n // Select a single cell: row 1, col 1 (B2)\n hot.selectCell(1, 1);\n});\n\ndocument.querySelector('#select-range')!.addEventListener('click', () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hot.selectCell(1, 1, 3, 3);\n});\n\ndocument.querySelector('#deselect')!.addEventListener('click', () => {\n hot.deselectCell();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example5.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Select cells programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst hot = new Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n ],\n width: 'auto',\n height: 'auto',\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n outsideClickDeselects: false,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ndocument.querySelector('#select-cell')!.addEventListener('click', () => {\n // Select a single cell: row 1, col 1 (B2)\n hot.selectCell(1, 1);\n});\n\ndocument.querySelector('#select-range')!.addEventListener('click', () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hot.selectCell(1, 1, 3, 3);\n});\n\ndocument.querySelector('#deselect')!.addEventListener('click', () => {\n hot.deselectCell();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example5.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.js.json index efcc7128c..4e233e7d4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n

Select a cell, then press Tab or → at the end of a row, or Enter or ↓ at the bottom of a column, to see the effect.

\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ],\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst autoWrapRowCheckbox = document.querySelector('#auto-wrap-row');\nconst autoWrapColCheckbox = document.querySelector('#auto-wrap-col');\nautoWrapRowCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapRow: autoWrapRowCheckbox.checked });\n});\nautoWrapColCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapCol: autoWrapColCheckbox.checked });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example6.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n

Select a cell, then press Tab or → at the end of a row, or Enter or ↓ at the bottom of a column, to see the effect.

\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ],\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst autoWrapRowCheckbox = document.querySelector('#auto-wrap-row');\nconst autoWrapColCheckbox = document.querySelector('#auto-wrap-col');\nautoWrapRowCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapRow: autoWrapRowCheckbox.checked });\n});\nautoWrapColCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapCol: autoWrapColCheckbox.checked });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example6.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.ts.json index 21e374ca2..fedcbb2b8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n

Select a cell, then press Tab or → at the end of a row, or Enter or ↓ at the bottom of a column, to see the effect.

\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ],\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst autoWrapRowCheckbox = document.querySelector('#auto-wrap-row')!;\nconst autoWrapColCheckbox = document.querySelector('#auto-wrap-col')!;\n\nautoWrapRowCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapRow: autoWrapRowCheckbox.checked });\n});\n\nautoWrapColCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapCol: autoWrapColCheckbox.checked });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example6.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n

Select a cell, then press Tab or → at the end of a row, or Enter or ↓ at the bottom of a column, to see the effect.

\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n ],\n colHeaders: ['SKU', 'Supplier', 'Category', 'Quantity'],\n width: 'auto',\n height: 'auto',\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst autoWrapRowCheckbox = document.querySelector('#auto-wrap-row')!;\nconst autoWrapColCheckbox = document.querySelector('#auto-wrap-col')!;\n\nautoWrapRowCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapRow: autoWrapRowCheckbox.checked });\n});\n\nautoWrapColCheckbox.addEventListener('change', () => {\n hot.updateSettings({ autoWrapCol: autoWrapColCheckbox.checked });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example6.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.js.json index 06eb9d6dc..9b6e6d73b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Selection · Resize a selection with handles · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example7');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Pre-select an interior range so the handles are immediately visible.\nhot.selectCell(1, 1, 4, 3);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example7.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Selection · Resize a selection with handles · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example7');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Pre-select an interior range so the handles are immediately visible.\nhot.selectCell(1, 1, 4, 3);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/selection/javascript/example7.js","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.ts.json index df122eb9a..a3a56cf91 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__javascript__example7.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Selection · Resize a selection with handles · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Pre-select an interior range so the handles are immediately visible.\nhot.selectCell(1, 1, 4, 3);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example7.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Selection · Resize a selection with handles · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n ],\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'City', 'Tenure'],\n rowHeaders: true,\n width: 'auto',\n height: 'auto',\n selectionHandles: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Pre-select an interior range so the handles are immediately visible.\nhot.selectCell(1, 1, 4, 3);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/selection/javascript/example7.ts","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example1.tsx.json index 2bf92ad1b..876385017 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst options: { value: string; label: string }[] = [\n { value: 'single', label: 'Single selection' },\n { value: 'range', label: 'Range selection' },\n { value: 'multiple', label: 'Multiple ranges selection' },\n];\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [selected, setSelected] = useState('multiple');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setSelected(value);\n setIsOpen(false);\n };\n\n const selectedLabel = options.find((o) => o.value === selected)?.label;\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {options.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example1.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst options: { value: string; label: string }[] = [\n { value: 'single', label: 'Single selection' },\n { value: 'range', label: 'Range selection' },\n { value: 'multiple', label: 'Multiple ranges selection' },\n];\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [selected, setSelected] = useState('multiple');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setSelected(value);\n setIsOpen(false);\n };\n\n const selectedLabel = options.find((o) => o.value === selected)?.label;\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {options.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example1.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example2.tsx.json index 6a3bbf634..f07f384db 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst gridData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('');\n\n const getButtonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const selected = hot?.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot?.getData(...selected[0]!) || [];\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n const item = selected[i];\n\n data.push(hot?.getData(...item));\n }\n }\n\n setOutput(JSON.stringify(data));\n };\n\n return (\n <>\n
\n
\n \n
\n \n {output}\n \n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example2.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst gridData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('');\n\n const getButtonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const selected = hot?.getSelected() || [];\n let data: Handsontable.CellValue[] = [];\n\n if (selected.length === 1) {\n data = hot?.getData(...selected[0]!) || [];\n } else {\n for (let i = 0; i < selected.length; i += 1) {\n const item = selected[i];\n\n data.push(hot?.getData(...item));\n }\n }\n\n setOutput(JSON.stringify(data));\n };\n\n return (\n <>\n
\n
\n \n
\n \n {output}\n \n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example2.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example3.tsx.json index 4de662fe3..bc20aa297 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Modify the selected cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const buttonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const selected = hot?.getSelected() || [];\n\n hot?.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot?.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot?.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot?.render();\n hot?.resumeRender();\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/react/example3.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Modify the selected cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const buttonClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const selected = hot?.getSelected() || [];\n\n hot?.suspendRender();\n\n for (let index = 0; index < selected.length; index += 1) {\n const [row1, column1, row2, column2] = selected[index];\n const startRow = Math.max(Math.min(row1, row2), 0);\n const endRow = Math.max(row1, row2);\n const startCol = Math.max(Math.min(column1, column2), 0);\n const endCol = Math.max(column1, column2);\n\n for (let rowIndex = startRow; rowIndex <= endRow; rowIndex += 1) {\n for (let columnIndex = startCol; columnIndex <= endCol; columnIndex += 1) {\n hot?.setDataAtCell(rowIndex, columnIndex, 'data changed');\n hot?.setCellMeta(rowIndex, columnIndex, 'className', 'c-red');\n }\n }\n }\n\n hot?.render();\n hot?.resumeRender();\n };\n\n return (\n <>\n
\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".c-red {\n color: red;\n}"},"docsPath":"guides/cell-features/selection/react/example3.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example4.tsx.json index 2aca4363f..4df3e49a7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Style the selection area · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example4.css';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example4.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/react/example4.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Style the selection area · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example4.css';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example4.css":"/* First selection layer — applied to every selected cell */\n#example4 td.area {\n background-color: rgba(75, 137, 255, 0.2);\n}\n\n/* Second non-adjacent selection layer (Ctrl/Cmd + click) */\n#example4 td.area.area-1 {\n background-color: rgba(75, 137, 255, 0.4);\n}\n\n/* Third non-adjacent selection layer */\n#example4 td.area.area-2 {\n background-color: rgba(75, 137, 255, 0.6);\n}"},"docsPath":"guides/cell-features/selection/react/example4.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example5.tsx.json index 3d0c7e180..34498f02c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Select cells programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const selectCell = () => {\n // Select a single cell: row 1, col 1 (B2)\n hotRef.current?.hotInstance?.selectCell(1, 1);\n };\n\n const selectRange = () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hotRef.current?.hotInstance?.selectCell(1, 1, 3, 3);\n };\n\n const deselect = () => {\n hotRef.current?.hotInstance?.deselectCell();\n };\n\n return (\n <>\n
\n
\n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example5.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Select cells programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const selectCell = () => {\n // Select a single cell: row 1, col 1 (B2)\n hotRef.current?.hotInstance?.selectCell(1, 1);\n };\n\n const selectRange = () => {\n // Select a range: row 1, col 1 to row 3, col 3 (B2:D4)\n hotRef.current?.hotInstance?.selectCell(1, 1, 3, 3);\n };\n\n const deselect = () => {\n hotRef.current?.hotInstance?.deselectCell();\n };\n\n return (\n <>\n
\n
\n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example5.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example6.tsx.json index dd35f7faa..3f94332ef 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [autoWrapRow, setAutoWrapRow] = useState(true);\n const [autoWrapCol, setAutoWrapCol] = useState(true);\n\n return (\n <>\n
\n
\n \n \n
\n

\n Select a cell, then press Tab or → at the end of a row, or Enter or{' '}\n ↓ at the bottom of a column, to see the effect.\n

\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example6.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Harbor Goods', 'Electronics', 142],\n ['SKU-0093', 'Alpine Supply Co.', 'Apparel', 67],\n ['SKU-2210', 'Harbor Goods', 'Electronics', 0],\n ['SKU-7734', 'Nordic Traders', 'Home Goods', 58],\n ['SKU-1145', 'Alpine Supply Co.', 'Apparel', 213],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [autoWrapRow, setAutoWrapRow] = useState(true);\n const [autoWrapCol, setAutoWrapCol] = useState(true);\n\n return (\n <>\n
\n
\n \n \n
\n

\n Select a cell, then press Tab or → at the end of a row, or Enter or{' '}\n ↓ at the bottom of a column, to see the effect.\n

\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example6.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example7.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example7.tsx.json index 850ea6fcf..9cf3f4b0d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example7.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__react__example7.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Selection · Resize a selection with handles · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n // Pre-select an interior range so the handles are immediately visible.\n useEffect(() => {\n hotRef.current?.hotInstance?.selectCell(1, 1, 4, 3);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example7.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Selection · Resize a selection with handles · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', 95000, 'Madrid', 12],\n ['James Okafor', 'Marketing', 'Product Manager', 88000, 'Lagos', 8],\n ['Li Wei', 'Engineering', 'Frontend Dev', 82000, 'Shanghai', 5],\n ['Maria Santos', 'HR', 'HR Specialist', 71000, 'Lisbon', 3],\n ['David Kim', 'Engineering', 'Backend Dev', 85000, 'Seoul', 7],\n ['Emma Wilson', 'Marketing', 'SEO Analyst', 68000, 'London', 2],\n ['Ahmed Hassan', 'Finance', 'Controller', 92000, 'Cairo', 10],\n ['Sara Johansson', 'Engineering', 'QA Engineer', 78000, 'Stockholm', 6],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n // Pre-select an interior range so the handles are immediately visible.\n useEffect(() => {\n hotRef.current?.hotInstance?.selectCell(1, 1, 4, 3);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/selection/react/example7.tsx","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example1.vue.json index 1c0422799..6f1cd7164 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example1.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example1.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example2.vue.json index ff6934e90..b6f23e0e8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example2.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Get data from the selected ranges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example2.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example2","exampleTitle":"Get data from the selected ranges","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example3.vue.json index c7914974d..6a92240b5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Modify the selected cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/selection/vue/example3.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Modify the selected cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/selection/vue/example3.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example3","exampleTitle":"Modify the selected cells","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example4.vue.json index febd51064..022fd6ecd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Style the selection area · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/selection/vue/example4.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Style the selection area · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-features/selection/vue/example4.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example4","exampleTitle":"Style the selection area","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example5.vue.json index ddc8840a4..11b734137 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Select cells programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example5.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Select cells programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example5.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example5","exampleTitle":"Select cells programmatically","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example6.vue.json index 439fa705e..4128d6140 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example6.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Jump across horizontal edges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example6.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example6","exampleTitle":"Jump across horizontal edges","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example7.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example7.vue.json index 8ec4c7e49..7060e2699 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example7.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__selection__vue__example7.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Selection · Resize a selection with handles · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example7.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Selection · Resize a selection with handles · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/selection/vue/example7.vue","breadcrumb":["Cell Features","Selection"],"guide":"guides/cell-features/selection/selection.md","guideTitle":"Selection","exampleId":"example7","exampleTitle":"Resize a selection with handles","docPermalink":"/selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__angular__example1.ts.json index dffad2670..d347c1acb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Features ▸ Text alignment · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-text-alignment',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n // generate an array of arrays with dummy data\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta: (row: number, col: number, key: string, val: unknown) => {\n console.log('cell meta changed', row, col, key, val);\n }\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/text-alignment/angular/example1.ts","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"Angular"} +{"framework":"angular","displayName":"Cell Features ▸ Text alignment · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-text-alignment',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n // generate an array of arrays with dummy data\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly gridSettings: GridSettings = {\n height: 320,\n colWidths: 100,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta: (row: number, col: number, key: string, val: unknown) => {\n console.log('cell meta changed', row, col, key, val);\n }\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-features/text-alignment/angular/example1.ts","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.js.json index dcca9ff16..7e9cd199b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Features ▸ Text alignment · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n licenseKey: 'non-commercial-and-evaluation',\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta(row, col, key, val) {\n console.log('cell meta changed', row, col, key, val);\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/text-alignment/javascript/example1.js","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Features ▸ Text alignment · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n licenseKey: 'non-commercial-and-evaluation',\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta(row, col, key, val) {\n console.log('cell meta changed', row, col, key, val);\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-features/text-alignment/javascript/example1.js","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.ts.json index 8554036ed..be5bf559b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Features ▸ Text alignment · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n licenseKey: 'non-commercial-and-evaluation',\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta(row, col, key, val) {\n console.log('cell meta changed', row, col, key, val);\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/text-alignment/javascript/example1.ts","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Features ▸ Text alignment · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n contextMenu: true,\n licenseKey: 'non-commercial-and-evaluation',\n mergeCells: [\n { row: 1, col: 1, rowspan: 3, colspan: 3 },\n { row: 3, col: 4, rowspan: 2, colspan: 2 },\n ],\n className: 'htCenter',\n cell: [\n { row: 0, col: 0, className: 'htRight' },\n { row: 1, col: 1, className: 'htLeft htMiddle' },\n { row: 3, col: 4, className: 'htLeft htBottom' },\n ],\n afterSetCellMeta(row, col, key, val) {\n console.log('cell meta changed', row, col, key, val);\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-features/text-alignment/javascript/example1.ts","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__react__example1.tsx.json index 6fc67dfa7..b30377c72 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Features ▸ Text alignment · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/text-alignment/react/example1.tsx","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Features ▸ Text alignment · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(18) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-features/text-alignment/react/example1.tsx","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__vue__example1.vue.json index 75619bd13..22135d6c4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-features__text-alignment__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Features ▸ Text alignment · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/text-alignment/vue/example1.vue","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Features ▸ Text alignment · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-features/text-alignment/vue/example1.vue","breadcrumb":["Cell Features","Text alignment"],"guide":"guides/cell-features/text-alignment/text-alignment.md","guideTitle":"Text alignment","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-alignment","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example1.ts.json index f75a54198..f39cee7f7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotCellEditorComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [],\n template: `\n `,\n})\nexport class EditorComponent extends HotCellEditorComponent {\n override onFocus(): void {}\n\n toUpperCase(): void {\n this.setValue((this.getValue() ?? '').toUpperCase());\n this.finishEdit.emit();\n }\n\n toLowerCase(): void {\n this.setValue((this.getValue() ?? '').toLowerCase());\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'example1-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Obrien Fischer'],\n ['Alexandria Gordon'],\n ['John Stafford'],\n ['Regina Waters'],\n ['Kay Bentley'],\n ['Emerson Drake'],\n ['Dean Stapleton'],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n width: 250,\n editor: EditorComponent,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example1.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotCellEditorComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [],\n template: `\n `,\n})\nexport class EditorComponent extends HotCellEditorComponent {\n override onFocus(): void {}\n\n toUpperCase(): void {\n this.setValue((this.getValue() ?? '').toUpperCase());\n this.finishEdit.emit();\n }\n\n toLowerCase(): void {\n this.setValue((this.getValue() ?? '').toLowerCase());\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'example1-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Obrien Fischer'],\n ['Alexandria Gordon'],\n ['John Stafford'],\n ['Regina Waters'],\n ['Kay Bentley'],\n ['Emerson Drake'],\n ['Dean Stapleton'],\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n width: 250,\n editor: EditorComponent,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example1.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example2.ts.json index 4674f504b..55e9709b2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Class-based editors · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { TextEditor } from 'handsontable/editors';\n\nclass CustomEditor extends TextEditor {\n override createElements() {\n super.createElements();\n\n this.TEXTAREA = document.createElement('input');\n this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\n@Component({\n selector: 'example2-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n startRows: 5,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colWidths: 200,\n columns: [\n {\n editor: CustomEditor,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example2.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Class-based editors · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { TextEditor } from 'handsontable/editors';\n\nclass CustomEditor extends TextEditor {\n override createElements() {\n super.createElements();\n\n this.TEXTAREA = document.createElement('input');\n this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\n@Component({\n selector: 'example2-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n startRows: 5,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colWidths: 200,\n columns: [\n {\n editor: CustomEditor,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example2.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example3.ts.json index 31a464e71..1aa6583cf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Extending an existing editor · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { TextEditor } from 'handsontable/editors';\nimport Handsontable from 'handsontable/base';\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n _instance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\n@Component({\n selector: 'example3-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [\n { type: 'text' },\n { type: 'text' },\n { type: 'text' },\n { editor: PasswordEditor as typeof TextEditor, renderer: maskedRenderer },\n ],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example3.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example3","exampleTitle":"Extending an existing editor","docPermalink":"/cell-editor","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell editor · Extending an existing editor · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { TextEditor } from 'handsontable/editors';\nimport Handsontable from 'handsontable/base';\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n _instance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\n@Component({\n selector: 'example3-cell-editor',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [\n { type: 'text' },\n { type: 'text' },\n { type: 'text' },\n { editor: PasswordEditor as typeof TextEditor, renderer: maskedRenderer },\n ],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-editor/angular/example3.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example3","exampleTitle":"Extending an existing editor","docPermalink":"/cell-editor","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.js.json index 8c23d1f05..47d804d8a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell editor · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { TextEditor } from 'handsontable/editors/textEditor';\n\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n createElements() {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input');\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(hotInstance, td, row, col, prop, value) {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [{ type: 'text' }, { type: 'text' }, { type: 'text' }, { editor: PasswordEditor, renderer: maskedRenderer }],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-editor/javascript/example1.js","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell editor · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { TextEditor } from 'handsontable/editors/textEditor';\n\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n createElements() {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input');\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(hotInstance, td, row, col, prop, value) {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [{ type: 'text' }, { type: 'text' }, { type: 'text' }, { editor: PasswordEditor, renderer: maskedRenderer }],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-editor/javascript/example1.js","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.ts.json index 5e0a11033..e138a65bd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell editor · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { TextEditor } from 'handsontable/editors/textEditor';\n\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [\n { type: 'text' },\n { type: 'text' },\n { type: 'text' },\n { editor: PasswordEditor as typeof TextEditor, renderer: maskedRenderer },\n ],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-editor/javascript/example1.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell editor · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { TextEditor } from 'handsontable/editors/textEditor';\n\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n ],\n colHeaders: ['Name', 'Email', 'Role', 'Password'],\n columns: [\n { type: 'text' },\n { type: 'text' },\n { type: 'text' },\n { editor: PasswordEditor as typeof TextEditor, renderer: maskedRenderer },\n ],\n colWidths: [130, 190, 70, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-editor/javascript/example1.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.js.json index ce0a36b04..da783b4d3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell editor · Class-based editors · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nregisterAllModules();\nclass SelectEditor extends BaseEditor {\n init() {\n this.select = this.hot.rootDocument.createElement('SELECT');\n this.select.setAttribute('data-hot-input', 'true');\n this.select.classList.add('htSelectEditor');\n this.select.style.display = 'none';\n this.hot.rootElement.appendChild(this.select);\n }\n prepare(row, col, prop, td, originalValue, cellProperties) {\n super.prepare(row, col, prop, td, originalValue, cellProperties);\n const rawOptions = this.cellProperties.selectOptions ?? [];\n const options = Array.isArray(rawOptions)\n ? Object.fromEntries(rawOptions.map((v) => [v, v]))\n : rawOptions;\n this.select.innerText = '';\n Object.keys(options).forEach((key) => {\n const option = this.hot.rootDocument.createElement('OPTION');\n option.value = key;\n option.innerText = options[key];\n this.select.appendChild(option);\n });\n }\n getValue() {\n return this.select.value;\n }\n setValue(value) {\n this.select.value = value;\n }\n open() {\n const { top, start, width, height } = this.getEditedCellRect();\n const s = this.select.style;\n s.height = `${height}px`;\n s.minWidth = `${width}px`;\n s.top = `${top}px`;\n s[this.hot.isRtl() ? 'right' : 'left'] = `${start}px`;\n s.margin = '0px';\n s.display = '';\n this.addHook('beforeKeyDown', (event) => {\n const { selectedIndex, length } = this.select;\n if (event.keyCode === 38 && selectedIndex > 0) {\n this.select[selectedIndex - 1].selected = true;\n event.preventDefault();\n // block the grid's default arrow-key actions\n return false;\n }\n if (event.keyCode === 40 && selectedIndex < length - 1) {\n this.select[selectedIndex + 1].selected = true;\n event.preventDefault();\n // block the grid's default arrow-key actions\n return false;\n }\n });\n }\n close() {\n this.select.style.display = 'none';\n this.clearHooks();\n }\n focus() {\n this.select.focus();\n }\n}\nconst PRIORITY_COLORS = {\n Low: '#22c55e',\n Medium: '#f59e0b',\n High: '#ef4444',\n Critical: '#7c3aed',\n};\nconst STATUS_COLORS = {\n 'To Do': '#6b7280',\n 'In Progress': '#3b82f6',\n Review: '#f59e0b',\n Done: '#22c55e',\n};\nfunction badgeRenderer(colorMap) {\n return (hotInstance, td, row, col, prop, value) => {\n td.innerText = '';\n if (value) {\n const badge = hotInstance.rootDocument.createElement('span');\n badge.className = 'htSelectBadge';\n badge.style.background = colorMap[value] ?? '#6b7280';\n badge.innerText = value;\n td.appendChild(badge);\n }\n return td;\n };\n}\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Migrate database schema', 'High', 'In Progress'],\n ['Update API documentation', 'Medium', 'To Do'],\n ['Fix authentication bug', 'Critical', 'Review'],\n ['Add dark mode support', 'Low', 'Done'],\n ['Improve test coverage', 'Medium', 'In Progress'],\n ['Deploy to staging server', 'High', 'To Do'],\n ['Refactor billing module', 'Medium', 'Done'],\n ],\n colHeaders: ['Task', 'Priority', 'Status'],\n columns: [\n { type: 'text' },\n {\n editor: SelectEditor,\n renderer: badgeRenderer(PRIORITY_COLORS),\n selectOptions: ['Low', 'Medium', 'High', 'Critical'],\n },\n {\n editor: SelectEditor,\n renderer: badgeRenderer(STATUS_COLORS),\n selectOptions: ['To Do', 'In Progress', 'Review', 'Done'],\n },\n ],\n colWidths: [220, 110, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".htSelectEditor {\n /* Enables dimension changes for in WebKit browsers */\n -webkit-appearance: menulist-button !important;\n position: absolute;\n width: auto;\n z-index: 300;\n}\n\n.htSelectBadge {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #fff;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-editor/javascript/example2.js","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.ts.json index 9ef7ddd76..3b769875a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell editor · Class-based editors · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\n\nregisterAllModules();\n\nclass SelectEditor extends BaseEditor {\n declare select: HTMLSelectElement;\n\n init(): void {\n this.select = this.hot.rootDocument.createElement('SELECT') as HTMLSelectElement;\n this.select.setAttribute('data-hot-input', 'true');\n this.select.classList.add('htSelectEditor');\n this.select.style.display = 'none';\n this.hot.rootElement.appendChild(this.select);\n }\n\n override prepare(\n row: number,\n col: number,\n prop: number | string,\n td: HTMLTableCellElement,\n originalValue: any,\n cellProperties: object\n ): void {\n super.prepare(row, col, prop, td, originalValue, cellProperties);\n\n const rawOptions = (this.cellProperties as any).selectOptions ?? [];\n const options: Record = Array.isArray(rawOptions)\n ? Object.fromEntries(rawOptions.map((v: any) => [v, v]))\n : rawOptions;\n\n this.select.innerText = '';\n Object.keys(options).forEach((key) => {\n const option = this.hot.rootDocument.createElement('OPTION') as HTMLOptionElement;\n\n option.value = key;\n option.innerText = options[key];\n this.select.appendChild(option);\n });\n }\n\n getValue(): string {\n return this.select.value;\n }\n\n setValue(value: string): void {\n this.select.value = value;\n }\n\n open(): void {\n const { top, start, width, height } = this.getEditedCellRect();\n const s = this.select.style;\n\n s.height = `${height}px`;\n s.minWidth = `${width}px`;\n s.top = `${top}px`;\n (s as any)[this.hot.isRtl() ? 'right' : 'left'] = `${start}px`;\n s.margin = '0px';\n s.display = '';\n\n this.addHook('beforeKeyDown', (event: KeyboardEvent) => {\n const { selectedIndex, length } = this.select;\n\n if (event.keyCode === 38 && selectedIndex > 0) {\n (this.select[selectedIndex - 1] as HTMLOptionElement).selected = true;\n event.preventDefault();\n\n // block the grid's default arrow-key actions\n return false;\n }\n\n if (event.keyCode === 40 && selectedIndex < length - 1) {\n (this.select[selectedIndex + 1] as HTMLOptionElement).selected = true;\n event.preventDefault();\n\n // block the grid's default arrow-key actions\n return false;\n }\n });\n }\n\n close(): void {\n this.select.style.display = 'none';\n this.clearHooks();\n }\n\n focus(): void {\n this.select.focus();\n }\n}\n\nconst PRIORITY_COLORS: Record = {\n Low: '#22c55e',\n Medium: '#f59e0b',\n High: '#ef4444',\n Critical: '#7c3aed',\n};\n\nconst STATUS_COLORS: Record = {\n 'To Do': '#6b7280',\n 'In Progress': '#3b82f6',\n Review: '#f59e0b',\n Done: '#22c55e',\n};\n\nfunction badgeRenderer(colorMap: Record) {\n return (\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any\n ): HTMLTableCellElement => {\n td.innerText = '';\n\n if (value) {\n const badge = hotInstance.rootDocument.createElement('span');\n\n badge.className = 'htSelectBadge';\n badge.style.background = colorMap[value] ?? '#6b7280';\n badge.innerText = value as string;\n td.appendChild(badge);\n }\n\n return td;\n };\n}\n\nconst container = document.querySelector('#example2') as HTMLElement;\n\nnew Handsontable(container, {\n data: [\n ['Migrate database schema', 'High', 'In Progress'],\n ['Update API documentation', 'Medium', 'To Do'],\n ['Fix authentication bug', 'Critical', 'Review'],\n ['Add dark mode support', 'Low', 'Done'],\n ['Improve test coverage', 'Medium', 'In Progress'],\n ['Deploy to staging server', 'High', 'To Do'],\n ['Refactor billing module', 'Medium', 'Done'],\n ],\n colHeaders: ['Task', 'Priority', 'Status'],\n columns: [\n { type: 'text' },\n {\n editor: SelectEditor as typeof BaseEditor,\n renderer: badgeRenderer(PRIORITY_COLORS),\n selectOptions: ['Low', 'Medium', 'High', 'Critical'],\n } as any,\n {\n editor: SelectEditor as typeof BaseEditor,\n renderer: badgeRenderer(STATUS_COLORS),\n selectOptions: ['To Do', 'In Progress', 'Review', 'Done'],\n } as any,\n ],\n colWidths: [220, 110, 130],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".htSelectEditor {\n /* Enables dimension changes for in WebKit browsers */\n -webkit-appearance: menulist-button !important;\n position: absolute;\n width: auto;\n z-index: 300;\n}\n\n.htSelectBadge {\n display: inline-block;\n padding: 2px 10px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #fff;\n letter-spacing: 0.3px;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-editor/javascript/example2.ts","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example1.tsx.json index bbe367209..6a4d72ca0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { MouseEvent, useRef } from 'react';\nimport { HotTable, HotColumn, useHotEditor } from '@handsontable/react-wrapper';\n\nconst EditorComponent = () => {\n const mainElementRef = useRef(null);\n\n const { value, setValue, finishEditing } = useHotEditor({\n onOpen: () => {\n if (!mainElementRef.current) return;\n\n mainElementRef.current.style.display = 'block';\n },\n onClose: () => {\n if (!mainElementRef.current) return;\n\n mainElementRef.current.style.display = 'none';\n },\n onPrepare: (_row, _column, _prop, TD, _originalValue, _cellProperties) => {\n const tdPosition = TD.getBoundingClientRect();\n\n // As the `prepare` method is triggered after selecting\n // any cell, we're updating the styles for the editor element,\n // so it shows up in the correct position.\n if (!mainElementRef.current) return;\n mainElementRef.current.style.left = `${tdPosition.left + window.pageXOffset}px`;\n mainElementRef.current.style.top = `${tdPosition.top + window.pageYOffset}px`;\n },\n onFocus: () => {},\n });\n\n const setLowerCase = () => {\n setValue(value.toString().toLowerCase());\n finishEditing();\n };\n\n const setUpperCase = () => {\n setValue(value.toString().toUpperCase());\n finishEditing();\n };\n\n const stopMousedownPropagation = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const buttonValue = value || '';\n\n return (\n \n \n \n \n );\n};\n\nconst data = [\n ['Obrien Fischer'],\n ['Alexandria Gordon'],\n ['John Stafford'],\n ['Regina Waters'],\n ['Kay Bentley'],\n ['Emerson Drake'],\n ['Dean Stapleton'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example1.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { MouseEvent, useRef } from 'react';\nimport { HotTable, HotColumn, useHotEditor } from '@handsontable/react-wrapper';\n\nconst EditorComponent = () => {\n const mainElementRef = useRef(null);\n\n const { value, setValue, finishEditing } = useHotEditor({\n onOpen: () => {\n if (!mainElementRef.current) return;\n\n mainElementRef.current.style.display = 'block';\n },\n onClose: () => {\n if (!mainElementRef.current) return;\n\n mainElementRef.current.style.display = 'none';\n },\n onPrepare: (_row, _column, _prop, TD, _originalValue, _cellProperties) => {\n const tdPosition = TD.getBoundingClientRect();\n\n // As the `prepare` method is triggered after selecting\n // any cell, we're updating the styles for the editor element,\n // so it shows up in the correct position.\n if (!mainElementRef.current) return;\n mainElementRef.current.style.left = `${tdPosition.left + window.pageXOffset}px`;\n mainElementRef.current.style.top = `${tdPosition.top + window.pageYOffset}px`;\n },\n onFocus: () => {},\n });\n\n const setLowerCase = () => {\n setValue(value.toString().toLowerCase());\n finishEditing();\n };\n\n const setUpperCase = () => {\n setValue(value.toString().toUpperCase());\n finishEditing();\n };\n\n const stopMousedownPropagation = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const buttonValue = value || '';\n\n return (\n \n \n \n \n );\n};\n\nconst data = [\n ['Obrien Fischer'],\n ['Alexandria Gordon'],\n ['John Stafford'],\n ['Regina Waters'],\n ['Kay Bentley'],\n ['Emerson Drake'],\n ['Dean Stapleton'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example1.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example2.tsx.json index 9c2167acb..dc5a64928 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Class-based editors · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { TextEditor } from 'handsontable/editors/textEditor';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass CustomEditor extends TextEditor {\n createElements() {\n super.createElements();\n\n this.TEXTAREA = document.createElement('input');\n this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example2.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Class-based editors · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { TextEditor } from 'handsontable/editors/textEditor';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass CustomEditor extends TextEditor {\n createElements() {\n super.createElements();\n\n this.TEXTAREA = document.createElement('input');\n this.TEXTAREA.setAttribute('placeholder', 'Custom placeholder');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example2.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example3.tsx.json index 3f89f5b87..7c090bf21 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Extending an existing editor · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { TextEditor } from 'handsontable/editors/textEditor';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n _instance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst data = [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example3.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example3","exampleTitle":"Extending an existing editor","docPermalink":"/cell-editor","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell editor · Extending an existing editor · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { TextEditor } from 'handsontable/editors/textEditor';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass PasswordEditor extends TextEditor {\n override createElements(): void {\n super.createElements();\n this.TEXTAREA = this.hot.rootDocument.createElement('input') as HTMLInputElement;\n this.TEXTAREA.setAttribute('type', 'password');\n this.TEXTAREA.setAttribute('data-hot-input', 'true');\n this.textareaStyle = this.TEXTAREA.style;\n this.textareaStyle.width = '0';\n this.textareaStyle.height = '0';\n this.TEXTAREA_PARENT.innerText = '';\n this.TEXTAREA_PARENT.appendChild(this.TEXTAREA);\n }\n}\n\nfunction maskedRenderer(\n _instance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n td.innerText = value ? '●●●●●●●●' : '—';\n td.style.letterSpacing = value ? '2px' : 'normal';\n\n return td;\n}\n\nconst data = [\n ['Alice Chen', 'alice@example.com', 'Admin', 'Wh1stl3!2024'],\n ['Bob Garcia', 'bob@example.com', 'Editor', 'P@ssw0rd42'],\n ['Carol Smith', 'carol@example.com', 'Viewer', 'Tr0ub4dor&3'],\n ['Dave Kim', 'dave@example.com', 'Editor', 'c0rrectH0rs3'],\n ['Eve Johnson', 'eve@example.com', 'Admin', 'Sup3rS3cr3t!'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-editor/react/example3.tsx","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example3","exampleTitle":"Extending an existing editor","docPermalink":"/cell-editor","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example1.vue.json index 9ec1907c9..a41d6c57d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell editor · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-editor/vue/example1.vue","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell editor · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-editor/vue/example1.vue","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-editor","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example2.vue.json index 4a9e49569..b33d6dc5e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-editor__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell editor · Class-based editors · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-functions/cell-editor/vue/example2.vue","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell editor · Class-based editors · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-functions/cell-editor/vue/example2.vue","breadcrumb":["Cell Functions","Cell editor"],"guide":"guides/cell-functions/cell-editor/cell-editor.md","guideTitle":"Cell editor","exampleId":"example2","exampleTitle":"Class-based editors","docPermalink":"/cell-editor","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__angular__example1.ts.json index 1869de30c..2274aa022 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nconst stockRenderer = (\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement => {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n};\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nconst stockValidator = (value: Handsontable.CellValue, callback: (valid: boolean) => void): void => {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n};\n\n@Component({\n selector: 'app-example1',\n template: `\n \n `,\n // ViewEncapsulation.None makes these styles global so they apply to DOM\n // elements created by the Handsontable renderer outside Angular's component tree.\n styles: [`\n .htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n }\n .htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n }\n .htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n }\n .htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n }\n `],\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n readonly hotData = [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n { type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n },\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-function/angular/example1.ts","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nconst stockRenderer = (\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement => {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n};\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nconst stockValidator = (value: Handsontable.CellValue, callback: (valid: boolean) => void): void => {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n};\n\n@Component({\n selector: 'app-example1',\n template: `\n \n `,\n // ViewEncapsulation.None makes these styles global so they apply to DOM\n // elements created by the Handsontable renderer outside Angular's component tree.\n styles: [`\n .htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n }\n .htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n }\n .htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n }\n .htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n }\n `],\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n readonly hotData = [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n { type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n },\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-function/angular/example1.ts","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.js.json index 358b12512..a8aa0f863 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(hotInstance, td, row, col, prop, value) {\n const num = parseInt(value, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value, callback) {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ],\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n },\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/javascript/example1.js","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(hotInstance, td, row, col, prop, value) {\n const num = parseInt(value, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value, callback) {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ],\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 },\n },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n },\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/javascript/example1.js","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.ts.json index ca806220c..caae65d99 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any\n): HTMLTableCellElement {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value: any, callback: (valid: boolean) => void): void {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ],\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n { type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n } as any,\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/javascript/example1.ts","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any\n): HTMLTableCellElement {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value: any, callback: (valid: boolean) => void): void {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst container = document.querySelector('#example1') as HTMLElement;\n\nnew Handsontable(container, {\n data: [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n ],\n colHeaders: ['Product', 'Price', 'Stock'],\n columns: [\n // Built-in type bundles renderer + editor + no validator\n { type: 'text' },\n // Built-in type bundles renderer + editor + validator with custom format\n { type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2 } },\n // Mixed: custom renderer, built-in numeric editor, custom validator\n {\n renderer: stockRenderer,\n editor: 'numeric',\n validator: stockValidator,\n allowInvalid: false,\n } as any,\n ],\n colWidths: [120, 90, 200],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/javascript/example1.ts","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__react__example1.tsx.json index 6a5ea0a40..bf48cbb02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value: Handsontable.CellValue, callback: (valid: boolean) => void): void {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst data = [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/react/example1.tsx","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Custom renderer: visualizes stock level as a progress bar with a numeric label.\n// Demonstrates using a renderer independently from the editor and validator.\nfunction stockRenderer(\n hotInstance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: Handsontable.CellValue\n): HTMLTableCellElement {\n const num = parseInt(value as string, 10);\n const valid = !isNaN(num) && num >= 0;\n const pct = valid ? Math.min(100, (num / 1000) * 100) : 0;\n const color = pct > 60 ? '#22c55e' : pct > 20 ? '#f59e0b' : '#ef4444';\n\n td.innerText = '';\n\n const wrapper = hotInstance.rootDocument.createElement('div');\n\n wrapper.className = 'htStockBar';\n\n const track = hotInstance.rootDocument.createElement('div');\n\n track.className = 'htStockBarTrack';\n\n const fill = hotInstance.rootDocument.createElement('div');\n\n fill.className = 'htStockBarFill';\n fill.style.width = `${pct}%`;\n fill.style.background = color;\n\n const label = hotInstance.rootDocument.createElement('span');\n\n label.className = 'htStockBarLabel';\n label.innerText = valid ? `${num}` : '—';\n track.appendChild(fill);\n wrapper.appendChild(track);\n wrapper.appendChild(label);\n td.appendChild(wrapper);\n\n return td;\n}\n\n// Custom validator: accepts integers in the range 0–1000.\n// Demonstrates using a validator independently from the renderer and editor.\nfunction stockValidator(value: Handsontable.CellValue, callback: (valid: boolean) => void): void {\n const num = Number(value);\n\n callback(Number.isInteger(num) && num >= 0 && num <= 1000);\n}\n\nconst data = [\n ['Apple', 1.2, 820],\n ['Banana', 0.5, 280],\n ['Cherry', 3.0, 45],\n ['Mango', 2.5, 960],\n ['Pear', 0.8, 170],\n ['Blueberry', 4.5, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".htStockBar {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 4px;\n height: 100%;\n box-sizing: border-box;\n}\n\n.htStockBarTrack {\n flex: 1;\n height: 8px;\n background: var(--ht-background-secondary-color);\n border-radius: 4px;\n overflow: hidden;\n}\n\n.htStockBarFill {\n height: 100%;\n border-radius: 4px;\n min-width: 2px;\n}\n\n.htStockBarLabel {\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n min-width: 28px;\n text-align: right;\n white-space: nowrap;\n}"},"docsPath":"guides/cell-functions/cell-function/react/example1.tsx","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__vue__example1.vue.json index d3753b7bc..db464b158 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-function__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-functions/cell-function/vue/example1.vue","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/cell-functions/cell-function/vue/example1.vue","breadcrumb":["Cell Functions"],"guide":"guides/cell-functions/cell-function/cell-function.md","guideTitle":"Cell functions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-function","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example1.ts.json index 10b1b4490..266aadd1e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from '@angular/core';\nimport {GridSettings, HotCellRendererComponent, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-cover-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: ``,\n})\nexport class CoverRendererComponent extends HotCellRendererComponent {\n}\n\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n @if (hotSettings) {\n \n }\n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: CoverRendererComponent },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example1.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from '@angular/core';\nimport {GridSettings, HotCellRendererComponent, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-cover-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: ``,\n})\nexport class CoverRendererComponent extends HotCellRendererComponent {\n}\n\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n @if (hotSettings) {\n \n }\n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: CoverRendererComponent },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example1.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example2.ts.json index 89e2d86eb..d7b2987ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n \n \n\n \n \n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild('myCellTpl', { static: true }) myCellTpl!: TemplateRef;\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: this.myCellTpl },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example2.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n \n \n\n \n \n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild('myCellTpl', { static: true }) myCellTpl!: TemplateRef;\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: this.myCellTpl },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example2.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example3.ts.json index 2c6ca496c..a6dd48c91 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport {GridSettings, HotCellRendererComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-color-renderer',\n template: `{{value}}`,\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ColorRendererComponent extends HotCellRendererComponent string\n}> implements OnInit {\n textColor = '';\n\n ngOnInit() {\n const props = this.getProps();\n this.textColor = props.textColor ?? 'black';\n\n if (props.textColorFn && typeof props.textColorFn === 'function') {\n this.textColor = props.textColorFn(this.value);\n }\n }\n\n}\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n rate: 3\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n rate: 9\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n rate: 5\n },\n ];\n\n readonly hotSettings: GridSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: ColorRendererComponent, rendererProps: { textColor: 'blue' } },\n { data: 'description', renderer: ColorRendererComponent, rendererProps: { textColor: 'orange' } },\n { data: 'rate', renderer: ColorRendererComponent, rendererProps: { textColorFn: (value: string) => +value <= 5 ? 'red' : 'inherit' } },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example3.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example3","exampleTitle":"Declare a custom renderer as a function","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport {GridSettings, HotCellRendererComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-color-renderer',\n template: `{{value}}`,\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ColorRendererComponent extends HotCellRendererComponent string\n}> implements OnInit {\n textColor = '';\n\n ngOnInit() {\n const props = this.getProps();\n this.textColor = props.textColor ?? 'black';\n\n if (props.textColorFn && typeof props.textColorFn === 'function') {\n this.textColor = props.textColorFn(this.value);\n }\n }\n\n}\n\n@Component({\n selector: 'app-example3',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n \n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n rate: 3\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n rate: 9\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n rate: 5\n },\n ];\n\n readonly hotSettings: GridSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: ColorRendererComponent, rendererProps: { textColor: 'blue' } },\n { data: 'description', renderer: ColorRendererComponent, rendererProps: { textColor: 'orange' } },\n { data: 'rate', renderer: ColorRendererComponent, rendererProps: { textColorFn: (value: string) => +value <= 5 ? 'red' : 'inherit' } },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example3.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example3","exampleTitle":"Declare a custom renderer as a function","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example4.ts.json index f6860bd6a..327da1390 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst coverRenderer = (_instance: Handsontable, td: HTMLTableCellElement, _row: number, _col: number, _prop: string | number, value: string) => {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\n\n@Component({\n selector: 'app-example4',\n template: `\n @if (hotSettings) {\n \n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example4.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst coverRenderer = (_instance: Handsontable, td: HTMLTableCellElement, _row: number, _col: number, _prop: string | number, value: string) => {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\n\n@Component({\n selector: 'app-example4',\n template: `\n @if (hotSettings) {\n \n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 400, 80],\n colHeaders: ['Title', 'Description', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example4.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example5.ts.json index f948445af..d1d21d16d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nfunction safeHtmlRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: string,\n _cellProperties: Handsontable.CellProperties\n) {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n return td;\n}\n\nfunction coverRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: string,\n _cellProperties: Handsontable.CellProperties\n) {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n}\n\n@Component({\n selector: 'app-example5',\n template: `\n @if (hotSettings) {\n \n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n }\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example5.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport {GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nfunction safeHtmlRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: string,\n _cellProperties: Handsontable.CellProperties\n) {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n return td;\n}\n\nfunction coverRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: string,\n _cellProperties: Handsontable.CellProperties\n) {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n}\n\n@Component({\n selector: 'app-example5',\n template: `\n @if (hotSettings) {\n \n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n readonly hotData = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover:\n '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title:\n 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title:\n 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n }\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n this.hotSettings = {\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example5.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example6.ts.json index bc6534016..b5d162d6f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, ViewChild } from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example6',\n template: `\n\n \n @if (hotSettings) {\n \n }\n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n isChecked = false;\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const componentThis = this;\n\n function customRenderer(_instance: Handsontable, td: HTMLTableCellElement) {\n textRenderer.apply(componentThis, arguments as unknown as Parameters);\n\n if (componentThis.isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n }\n\n this.hotSettings = {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col: number) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n\n exampleContainerMouseupCallback = (event: MouseEvent) => {\n const hot = this.hotTable.hotInstance!;\n const target = event.target as HTMLInputElement | null;\n\n if (target?.nodeName == 'INPUT' && target.className == 'checker') {\n this.isChecked = !target.checked;\n hot?.render();\n }\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example6.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit, ViewChild } from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example6',\n template: `\n\n \n @if (hotSettings) {\n \n }\n \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n isChecked = false;\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const componentThis = this;\n\n function customRenderer(_instance: Handsontable, td: HTMLTableCellElement) {\n textRenderer.apply(componentThis, arguments as unknown as Parameters);\n\n if (componentThis.isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n }\n\n this.hotSettings = {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col: number) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n\n exampleContainerMouseupCallback = (event: MouseEvent) => {\n const hot = this.hotTable.hotInstance!;\n const target = event.target as HTMLInputElement | null;\n\n if (target?.nodeName == 'INPUT' && target.className == 'checker') {\n this.isChecked = !target.checked;\n hot?.render();\n }\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example6.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example7.ts.json index 59046ddae..316a1cdfc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Format symbols outside the Intl standard · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example7-cell-renderer',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n ];\n\n readonly gridSettings: GridSettings = {\n data: this.data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value: unknown) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value: unknown) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example7.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example7","exampleTitle":"Format symbols outside the Intl standard","docPermalink":"/cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell renderer · Format symbols outside the Intl standard · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example7-cell-renderer',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n ];\n\n readonly gridSettings: GridSettings = {\n data: this.data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value: unknown) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value: unknown) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-functions/cell-renderer/angular/example7.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example7","exampleTitle":"Format symbols outside the Intl standard","docPermalink":"/cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.js.json index 6bf9dd9ef..88f240d49 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n];\n\nconst safeHtmlRenderer = (_instance, td, _row, _col, _prop, value) => {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n};\n\nconst coverRenderer = (_instance, td, _row, _col, _prop, value) => {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example4.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n];\n\nconst safeHtmlRenderer = (_instance, td, _row, _col, _prop, value) => {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n};\n\nconst coverRenderer = (_instance, td, _row, _col, _prop, value) => {\n const img = document.createElement('img');\n\n img.src = value;\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example4.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.ts.json index ff227c002..75c97f7a6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Book {\n title: string;\n description: string;\n comments: string;\n cover: string;\n}\n\nconst data: Book[] = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n];\n\nconst safeHtmlRenderer: BaseRenderer = (_instance, td, _row, _col, _prop, value) => {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n};\n\nconst coverRenderer: BaseRenderer = (_instance, td, _row, _col, _prop, value) => {\n const img = document.createElement('img');\n\n img.src = value;\n\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example4.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Book {\n title: string;\n description: string;\n comments: string;\n cover: string;\n}\n\nconst data: Book[] = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n];\n\nconst safeHtmlRenderer: BaseRenderer = (_instance, td, _row, _col, _prop, value) => {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n};\n\nconst coverRenderer: BaseRenderer = (_instance, td, _row, _col, _prop, value) => {\n const img = document.createElement('img');\n\n img.src = value;\n\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n};\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colWidths: [200, 200, 200, 80],\n colHeaders: ['Title', 'Description', 'Comments', 'Cover'],\n height: 'auto',\n columns: [\n { data: 'title', renderer: 'html' },\n { data: 'description', renderer: 'html' },\n { data: 'comments', renderer: safeHtmlRenderer },\n { data: 'cover', renderer: coverRenderer },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example4.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.js.json index 50cf5e51a..2a7b1e3d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nlet isChecked = false;\nconst exampleContainer = document.querySelector('#exampleContainer5');\nconst container = document.querySelector('#example5');\nconst customRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n};\n\nconst hot = new Handsontable(container, {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nexampleContainer.addEventListener('mousedown', (event) => {\n if (event.target.nodeName == 'INPUT' && event.target.className == 'checker') {\n event.stopPropagation();\n }\n});\nexampleContainer.addEventListener('mouseup', (event) => {\n if (event.target.nodeName == 'INPUT' && event.target.className == 'checker') {\n isChecked = !event.target.checked;\n hot.render();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example5.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nlet isChecked = false;\nconst exampleContainer = document.querySelector('#exampleContainer5');\nconst container = document.querySelector('#example5');\nconst customRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n};\n\nconst hot = new Handsontable(container, {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nexampleContainer.addEventListener('mousedown', (event) => {\n if (event.target.nodeName == 'INPUT' && event.target.className == 'checker') {\n event.stopPropagation();\n }\n});\nexampleContainer.addEventListener('mouseup', (event) => {\n if (event.target.nodeName == 'INPUT' && event.target.className == 'checker') {\n isChecked = !event.target.checked;\n hot.render();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example5.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.ts.json index 03ad05541..a440ac59e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nlet isChecked = false;\nconst exampleContainer = document.querySelector('#exampleContainer5')!;\nconst container = document.querySelector('#example5')!;\n\nconst customRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n};\n\nconst hot = new Handsontable(container, {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nexampleContainer.addEventListener('mousedown', (event) => {\n if ((event.target as HTMLElement).nodeName == 'INPUT' && (event.target as HTMLElement).className == 'checker') {\n event.stopPropagation();\n }\n});\n\nexampleContainer.addEventListener('mouseup', (event) => {\n if ((event.target as HTMLElement).nodeName == 'INPUT' && (event.target as HTMLElement).className == 'checker') {\n isChecked = !(event.target as HTMLInputElement).checked;\n hot.render();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example5.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer } from 'handsontable/renderers';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nlet isChecked = false;\nconst exampleContainer = document.querySelector('#exampleContainer5')!;\nconst container = document.querySelector('#example5')!;\n\nconst customRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n};\n\nconst hot = new Handsontable(container, {\n height: 'auto',\n columns: [{}, { renderer: customRenderer }],\n colHeaders(col) {\n return col === 0\n ? 'Bold and Beautiful'\n : `Some checkbox`;\n },\n sanitizer: sanitizeHeader,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nexampleContainer.addEventListener('mousedown', (event) => {\n if ((event.target as HTMLElement).nodeName == 'INPUT' && (event.target as HTMLElement).className == 'checker') {\n event.stopPropagation();\n }\n});\n\nexampleContainer.addEventListener('mouseup', (event) => {\n if ((event.target as HTMLElement).nodeName == 'INPUT' && (event.target as HTMLElement).className == 'checker') {\n isChecked = !(event.target as HTMLInputElement).checked;\n hot.render();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example5.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.js.json index 89b13c2c9..8659cf9d0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n];\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example6.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n];\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example6.js","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.ts.json index 00e203197..c6b0513d3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Holding {\n asset: string;\n btcValue: number;\n portfolioShare: number;\n}\n\nconst data: Holding[] = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n];\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example6.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Holding {\n asset: string;\n btcValue: number;\n portfolioShare: number;\n}\n\nconst data: Holding[] = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n];\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Asset', 'BTC-equivalent value', 'Portfolio share'],\n columns: [\n { data: 'asset' },\n {\n data: 'btcValue',\n type: 'numeric',\n // Bitcoin (₿) isn't an ISO 4217 currency, so `numericFormat` can't format it.\n // `valueFormatter` prepends the symbol instead.\n valueFormatter(value) {\n // `type: 'numeric'` turns numeric input into a number, but invalid input\n // stays a string, so check the type before calling `toFixed()`.\n if (typeof value !== 'number') {\n return value;\n }\n\n return `₿${value.toFixed(4)}`;\n },\n },\n {\n data: 'portfolioShare',\n // Per mille (‰) isn't a unit sanctioned by `Intl.NumberFormat`, so `valueFormatter`\n // appends the symbol manually.\n valueFormatter(value) {\n return `${value}‰`;\n },\n },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-renderer/javascript/example6.ts","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example1.tsx.json index 3c60b492e..471bff489 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\n// your renderer component\nconst RendererComponent = (props: RendererProps) => {\n // the available renderer-related props are:\n // - `row` (row index)\n // - `col` (column index)\n // - `prop` (column property name)\n // - `TD` (the HTML cell element)\n // - `cellProperties` (the `cellProperties` object for the edited cell)\n return (\n <>\n \n Row: {props.row}, column: {props.col},\n {' '}\n value: {props.value}\n \n );\n};\n\nconst hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ['A6', 'B6', 'C6', 'D6', 'E6'],\n ['A7', 'B7', 'C7', 'D7', 'E7'],\n ['A8', 'B8', 'C8', 'D8', 'E8'],\n ['A9', 'B9', 'C9', 'D9', 'E9'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example1.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\n// your renderer component\nconst RendererComponent = (props: RendererProps) => {\n // the available renderer-related props are:\n // - `row` (row index)\n // - `col` (column index)\n // - `prop` (column property name)\n // - `TD` (the HTML cell element)\n // - `cellProperties` (the `cellProperties` object for the edited cell)\n return (\n <>\n \n Row: {props.row}, column: {props.col},\n {' '}\n value: {props.value}\n \n );\n};\n\nconst hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1'],\n ['A2', 'B2', 'C2', 'D2', 'E2'],\n ['A3', 'B3', 'C3', 'D3', 'E3'],\n ['A4', 'B4', 'C4', 'D4', 'E4'],\n ['A5', 'B5', 'C5', 'D5', 'E5'],\n ['A6', 'B6', 'C6', 'D6', 'E6'],\n ['A7', 'B7', 'C7', 'D7', 'E7'],\n ['A8', 'B8', 'C8', 'D8', 'E8'],\n ['A9', 'B9', 'C9', 'D9', 'E9'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example1.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example2.tsx.json index 66e62aefd..52ea8d1a4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useContext, MouseEvent, createContext } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\n// a component\nconst HighlightContext = createContext(false);\n\n// a renderer component\nfunction CustomRenderer(props: RendererProps) {\n const darkMode = useContext(HighlightContext);\n\n if (!props.TD) return;\n\n if (darkMode) {\n props.TD.className = 'dark';\n } else {\n props.TD.className = '';\n }\n\n return
{props.value}
;\n}\n\nconst data = [['A1'], ['A2'], ['A3'], ['A4'], ['A5'], ['A6'], ['A7'], ['A8'], ['A9'], ['A10']];\n\nconst ExampleComponent = () => {\n const [darkMode, setDarkMode] = useState(false);\n\n const toggleDarkMode = (event: MouseEvent) => {\n setDarkMode((event.target as HTMLInputElement).checked);\n };\n\n return (\n \n
\n
\n \n
\n
\n \n \n \n
\n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example2 .handsontable td.dark {\n background: #000 !important;\n color: #fff !important;\n}\n\n#example2 .handsontable td {\n background: #fff !important;\n color: #000 !important;\n}"},"docsPath":"guides/cell-functions/cell-renderer/react/example2.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useContext, MouseEvent, createContext } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\n// a component\nconst HighlightContext = createContext(false);\n\n// a renderer component\nfunction CustomRenderer(props: RendererProps) {\n const darkMode = useContext(HighlightContext);\n\n if (!props.TD) return;\n\n if (darkMode) {\n props.TD.className = 'dark';\n } else {\n props.TD.className = '';\n }\n\n return
{props.value}
;\n}\n\nconst data = [['A1'], ['A2'], ['A3'], ['A4'], ['A5'], ['A6'], ['A7'], ['A8'], ['A9'], ['A10']];\n\nconst ExampleComponent = () => {\n const [darkMode, setDarkMode] = useState(false);\n\n const toggleDarkMode = (event: MouseEvent) => {\n setDarkMode((event.target as HTMLInputElement).checked);\n };\n\n return (\n \n
\n
\n \n
\n
\n \n \n \n
\n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#example2 .handsontable td.dark {\n background: #000 !important;\n color: #fff !important;\n}\n\n#example2 .handsontable td {\n background: #fff !important;\n color: #000 !important;\n}"},"docsPath":"guides/cell-functions/cell-renderer/react/example2.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example3.tsx.json index 2f9c30af6..81ded9d28 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg'],\n ['A2', '/docs/img/examples/javascript-the-good-parts.jpg'],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n },\n },\n ]}\n colHeaders={true}\n rowHeights={55}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example3.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example3","exampleTitle":"Declare a custom renderer as a function","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg'],\n ['A2', '/docs/img/examples/javascript-the-good-parts.jpg'],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n },\n },\n ]}\n colHeaders={true}\n rowHeights={55}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example3.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example3","exampleTitle":"Declare a custom renderer as a function","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example4.tsx.json index 8d1a3906e..30f5aa5ec 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n function safeHtmlRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue,\n _cellProperties: Handsontable.CellProperties\n ) {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n }\n\n function coverRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue,\n _cellProperties: Handsontable.CellProperties\n ) {\n const img = document.createElement('img');\n\n img.src = value;\n\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n }\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example4.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n {\n title:\n 'Professional JavaScript for Web Developers',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'I would rate it ★★★★☆',\n cover: '/docs/img/examples/professional-javascript-developers-nicholas-zakas.jpg',\n },\n {\n title: 'JavaScript: The Good Parts',\n description:\n 'This book provides a developer-level introduction along with more advanced and useful features of JavaScript.',\n comments: 'This is the book about JavaScript',\n cover: '/docs/img/examples/javascript-the-good-parts.jpg',\n },\n {\n title: 'JavaScript: The Definitive Guide',\n description:\n 'JavaScript: The Definitive Guide provides a thorough description of the core JavaScript language and both the legacy and standard DOMs implemented in web browsers.',\n comments:\n 'I\\'ve never actually read it, but the comments are highly positive.',\n cover: '/docs/img/examples/javascript-the-definitive-guide.jpg',\n },\n ];\n\n function safeHtmlRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue,\n _cellProperties: Handsontable.CellProperties\n ) {\n // WARNING: Be sure you only allow certain HTML tags to avoid XSS threats.\n // Sanitize the \"value\" before passing it to the innerHTML property.\n td.innerHTML = value;\n }\n\n function coverRenderer(\n _instance: Handsontable,\n td: HTMLTableCellElement,\n _row: number,\n _col: number,\n _prop: string | number,\n value: Handsontable.CellValue,\n _cellProperties: Handsontable.CellProperties\n ) {\n const img = document.createElement('img');\n\n img.src = value;\n\n img.addEventListener('mousedown', (event) => {\n event.preventDefault();\n });\n\n td.innerText = '';\n td.appendChild(img);\n\n return td;\n }\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example4.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example5.tsx.json index e3ae2bbf3..47eb756c3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, MouseEvent } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n let isChecked = false;\n\n function customRenderer(this: Handsontable, _instance: Handsontable, td: HTMLTableCellElement) {\n textRenderer.apply(this, arguments as any);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n }\n\n const exampleContainerMouseupCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n if (\n (event.target as HTMLInputElement).nodeName == 'INPUT' &&\n (event.target as HTMLInputElement).className == 'checker'\n ) {\n isChecked = !(event.target as HTMLInputElement).checked;\n hot?.render();\n }\n };\n\n return (\n
exampleContainerMouseupCallback(...args)}>\n Bold and Beautiful';\n\n case 1:\n return `Some checkbox`;\n\n default:\n return '';\n }\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n sanitizer={sanitizeHeader}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example5.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, MouseEvent } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['B', 'EM', 'INPUT', 'BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['type', 'class', 'checked', 'colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n let isChecked = false;\n\n function customRenderer(this: Handsontable, _instance: Handsontable, td: HTMLTableCellElement) {\n textRenderer.apply(this, arguments as any);\n\n if (isChecked) {\n td.style.backgroundColor = 'yellow';\n } else {\n td.style.backgroundColor = 'rgba(255,255,255,0.1)';\n }\n }\n\n const exampleContainerMouseupCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n if (\n (event.target as HTMLInputElement).nodeName == 'INPUT' &&\n (event.target as HTMLInputElement).className == 'checker'\n ) {\n isChecked = !(event.target as HTMLInputElement).checked;\n hot?.render();\n }\n };\n\n return (\n
exampleContainerMouseupCallback(...args)}>\n Bold and Beautiful';\n\n case 1:\n return `Some checkbox`;\n\n default:\n return '';\n }\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n sanitizer={sanitizeHeader}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example5.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example6.tsx.json index 4c4a49884..fafadc671 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example6.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n { asset: 'Bitcoin', btcValue: 12.45, portfolioShare: 452 },\n { asset: 'Ethereum', btcValue: 3.82, portfolioShare: 268 },\n { asset: 'Solana', btcValue: 1.15, portfolioShare: 134 },\n { asset: 'Cardano', btcValue: 0.47, portfolioShare: 81 },\n { asset: 'Polkadot', btcValue: 0.29, portfolioShare: 65 },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-renderer/react/example6.tsx","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example1.vue.json index c92853ec6..1741ce5d6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example1.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example1.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-renderer","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example2.vue.json index 476b2c5f6..95878f971 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example2.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Use the renderer component within React's context · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example2.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example2","exampleTitle":"Use the renderer component within React's context","docPermalink":"/cell-renderer","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example4.vue.json index a20beda39..e94143257 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example4.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Declare a custom renderer as a function (2) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example4.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example4","exampleTitle":"Declare a custom renderer as a function (2)","docPermalink":"/cell-renderer","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example5.vue.json index 5403d2cf9..764d87b7a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example5.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example5.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example5","exampleTitle":"Render custom HTML in cells","docPermalink":"/cell-renderer","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example6.vue.json index 65ce4f023..70a613d87 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-renderer__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example6.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell renderer · Render custom HTML in header · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-renderer/vue/example6.vue","breadcrumb":["Cell Functions","Cell renderer"],"guide":"guides/cell-functions/cell-renderer/cell-renderer.md","guideTitle":"Cell renderer","exampleId":"example6","exampleTitle":"Render custom HTML in header","docPermalink":"/cell-renderer","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example1.ts.json index 6151b317c..184d72115 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell validator · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value: unknown, callback: (valid: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(String(value))) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\n@Component({\n selector: 'app-example1',\n template: `\n {{output}}\n\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n output = 'Here you will see the log';\n\n readonly hotData = [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const componentInstance = this;\n\n this.hotSettings = {\n beforeChange(changes: (Handsontable.CellChange | null)[]) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (\n currChange[1] === 'name.first' ||\n currChange[1] === 'name.last'\n ) {\n if (currChange[3] !== null && typeof currChange[3] === 'string') {\n changes[i]![3] =\n currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source !== 'loadData') {\n componentInstance.output = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-validator/angular/example1.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell validator · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value: unknown, callback: (valid: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(String(value))) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\n@Component({\n selector: 'app-example1',\n template: `\n {{output}}\n\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n output = 'Here you will see the log';\n\n readonly hotData = [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ];\n\n hotSettings!: GridSettings;\n\n ngOnInit() {\n const componentInstance = this;\n\n this.hotSettings = {\n beforeChange(changes: (Handsontable.CellChange | null)[]) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (\n currChange[1] === 'name.first' ||\n currChange[1] === 'name.last'\n ) {\n if (currChange[3] !== null && typeof currChange[3] === 'string') {\n changes[i]![3] =\n currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source !== 'loadData') {\n componentInstance.output = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-validator/angular/example1.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example2.ts.json index da7b04636..c666709af 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\n@Component({\n selector: 'example2-cell-validator',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-validator/angular/example2.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"Angular"} +{"framework":"angular","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\n@Component({\n selector: 'example2-cell-validator',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-functions/cell-validator/angular/example2.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.js.json index 69c0b229e..99f8073d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell validator · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Here you will see the log\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst output = document.querySelector('#output');\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value, callback) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ],\n beforeChange(changes) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (currChange[1] === 'name.first' || currChange[1] === 'name.last') {\n if (currChange[3] !== null) {\n changes[i][3] = currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes, source) {\n if (source !== 'loadData') {\n output.innerText = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example1.js","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell validator · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Here you will see the log\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst output = document.querySelector('#output');\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value, callback) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ],\n beforeChange(changes) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (currChange[1] === 'name.first' || currChange[1] === 'name.last') {\n if (currChange[3] !== null) {\n changes[i][3] = currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes, source) {\n if (source !== 'loadData') {\n output.innerText = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example1.js","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.ts.json index caacb08d6..17f4515cf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell validator · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Here you will see the log\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value: string, callback: (value: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ],\n beforeChange(changes) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (currChange[1] === 'name.first' || currChange[1] === 'name.last') {\n if (currChange[3] !== null && typeof currChange[3] === 'string') {\n changes[i]![3] = currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes, source) {\n if (source !== 'loadData') {\n output.innerText = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example1.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell validator · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n Here you will see the log\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nconst ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\nconst emailValidator = (value: string, callback: (value: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n};\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n ],\n beforeChange(changes) {\n for (let i = changes.length - 1; i >= 0; i--) {\n const currChange = changes[i];\n\n if (!currChange) {\n continue;\n }\n\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (currChange[3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (currChange[3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (currChange[1] === 'name.first' || currChange[1] === 'name.last') {\n if (currChange[3] !== null && typeof currChange[3] === 'string') {\n changes[i]![3] = currChange[3].charAt(0).toUpperCase() + currChange[3].slice(1);\n }\n }\n }\n\n return true;\n },\n afterChange(changes, source) {\n if (source !== 'loadData') {\n output.innerText = JSON.stringify(changes);\n }\n },\n colHeaders: ['ID', 'First name', 'Last name', 'IP', 'E-mail'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example1.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.js.json index a86e140fd..03728999d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\nfunction decimalValidator(value, callback) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n return;\n }\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example2.js","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\nfunction decimalValidator(value, callback) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n return;\n }\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example2.js","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.ts.json index 7c0355365..41fbb082f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example2.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Channel', 'Conversion rate'],\n columns: [\n {},\n {},\n {\n validator: decimalValidator,\n allowInvalid: false,\n },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-functions/cell-validator/javascript/example2.ts","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example1.tsx.json index ab2d1ea30..e745ca134 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell validator · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { CellChange } from 'handsontable';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('');\n\n const ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\n const emailValidator = (value: string, callback: (value: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n };\n\n return (\n <>\n
\n \n {output}\n \n
\n = 0; i--) {\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (cellChanges[i][3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (cellChanges[i][3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (cellChanges[i][1] === 'name.first' || cellChanges[i][1] === 'name.last') {\n if (cellChanges[i][3] !== null) {\n cellChanges[i][3] = cellChanges[i][3].charAt(0).toUpperCase() + cellChanges[i][3].slice(1);\n }\n }\n }\n }}\n afterChange={function (changes, source) {\n if (source !== 'loadData' && source !== 'updateData') {\n setOutput(JSON.stringify(changes));\n }\n }}\n colHeaders={['ID', 'First name', 'Last name', 'IP', 'E-mail']}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n columns={[\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ]}\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-validator/react/example1.tsx","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell validator · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { CellChange } from 'handsontable';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Joe', last: 'Fabiano' },\n ip: '0.0.0.1',\n email: 'Joe.Fabiano@ex.com',\n },\n {\n id: 2,\n name: { first: 'Fred', last: 'Wecler' },\n ip: '0.0.0.1',\n email: 'Fred.Wecler@ex.com',\n },\n {\n id: 3,\n name: { first: 'Steve', last: 'Wilson' },\n ip: '0.0.0.1',\n email: 'Steve.Wilson@ex.com',\n },\n {\n id: 4,\n name: { first: 'Maria', last: 'Fernandez' },\n ip: '0.0.0.1',\n email: 'M.Fernandez@ex.com',\n },\n {\n id: 5,\n name: { first: 'Pierre', last: 'Barbault' },\n ip: '0.0.0.1',\n email: 'Pierre.Barbault@ex.com',\n },\n {\n id: 6,\n name: { first: 'Nancy', last: 'Moore' },\n ip: '0.0.0.1',\n email: 'Nancy.Moore@ex.com',\n },\n {\n id: 7,\n name: { first: 'Barbara', last: 'MacDonald' },\n ip: '0.0.0.1',\n email: 'B.MacDonald@ex.com',\n },\n {\n id: 8,\n name: { first: 'Wilma', last: 'Williams' },\n ip: '0.0.0.1',\n email: 'Wilma.Williams@ex.com',\n },\n {\n id: 9,\n name: { first: 'Sasha', last: 'Silver' },\n ip: '0.0.0.1',\n email: 'Sasha.Silver@ex.com',\n },\n {\n id: 10,\n name: { first: 'Don', last: 'Pérignon' },\n ip: '0.0.0.1',\n email: 'Don.Pérignon@ex.com',\n },\n {\n id: 11,\n name: { first: 'Aaron', last: 'Kinley' },\n ip: '0.0.0.1',\n email: 'Aaron.Kinley@ex.com',\n },\n];\n\nconst ExampleComponent = () => {\n const [output, setOutput] = useState('');\n\n const ipValidatorRegexp =\n /^(?:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b|null)$/;\n\n const emailValidator = (value: string, callback: (value: boolean) => void) => {\n setTimeout(() => {\n if (/.+@.+/.test(value)) {\n callback(true);\n } else {\n callback(false);\n }\n }, 1000);\n };\n\n return (\n <>\n
\n \n {output}\n \n
\n = 0; i--) {\n // gently don't accept the word \"foo\" (remove the change at index i)\n if (cellChanges[i][3] === 'foo') {\n changes.splice(i, 1);\n }\n // if any of pasted cells contains the word \"nuke\", reject the whole paste\n else if (cellChanges[i][3] === 'nuke') {\n return false;\n }\n // capitalise first letter in column 1 and 2\n else if (cellChanges[i][1] === 'name.first' || cellChanges[i][1] === 'name.last') {\n if (cellChanges[i][3] !== null) {\n cellChanges[i][3] = cellChanges[i][3].charAt(0).toUpperCase() + cellChanges[i][3].slice(1);\n }\n }\n }\n }}\n afterChange={function (changes, source) {\n if (source !== 'loadData' && source !== 'updateData') {\n setOutput(JSON.stringify(changes));\n }\n }}\n colHeaders={['ID', 'First name', 'Last name', 'IP', 'E-mail']}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n columns={[\n { data: 'id', type: 'numeric' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'ip', validator: ipValidatorRegexp, allowInvalid: true },\n { data: 'email', validator: emailValidator },\n ]}\n />\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-validator/react/example1.tsx","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example2.tsx.json index 4b5cdeecd..fe9cc502e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-validator/react/example2.tsx","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Spring Sale 2025', 'Email', '3.4'],\n ['Brand Awareness Q3', 'Paid Search', '8,1'],\n ['Retention Push', 'In-app', '12.0'],\n ['Partner Webinar', 'Organic', '6,75'],\n ['Holiday Preview', 'Social', '9.25'],\n];\n\ntype CellMeta = { allowEmpty?: boolean };\n\nfunction decimalValidator(this: CellMeta, value: unknown, callback: (valid: boolean) => void) {\n if (this.allowEmpty && (value === null || value === undefined || value === '')) {\n callback(true);\n\n return;\n }\n\n callback(/^\\d+[.,]\\d+$/.test(String(value)));\n}\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-functions/cell-validator/react/example2.tsx","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example1.vue.json index 84cdb45e4..54990b267 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell validator · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-validator/vue/example1.vue","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell validator · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-validator/vue/example1.vue","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-validator","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example2.vue.json index 00ce82a56..762a57ba9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__cell-validator__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-validator/vue/example2.vue","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Cell validator · Validate decimal numbers with dot or comma separators · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/cell-validator/vue/example2.vue","breadcrumb":["Cell Functions","Cell validator"],"guide":"guides/cell-functions/cell-validator/cell-validator.md","guideTitle":"Cell validator","exampleId":"example2","exampleTitle":"Validate decimal numbers with dot or comma separators","docPermalink":"/cell-validator","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example1.vue.json index 92f70358c..87d959218 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example1.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example1.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example2.vue.json index 838e3931c..935840303 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Vue component renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example2.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example2","exampleTitle":"Vue component renderer","docPermalink":"/custom-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Vue component renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example2.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example2","exampleTitle":"Vue component renderer","docPermalink":"/custom-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example3.vue.json index 0dfa78c98..91870db4c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-functions__custom-cells__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Custom editors · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example3.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example3","exampleTitle":"Custom editors","docPermalink":"/custom-cells","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Functions ▸ Custom cells · Custom editors · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-functions/custom-cells/vue/example3.vue","breadcrumb":["Cell Functions","Custom cells"],"guide":"guides/cell-functions/custom-cells/custom-cells.md","guideTitle":"Custom cells","exampleId":"example3","exampleTitle":"Custom editors","docPermalink":"/custom-cells","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example1.ts.json index 3fffa2cae..c92350f84 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\n@Component({\n selector: 'example1-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\n@Component({\n selector: 'example1-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example10.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example10.ts.json index 846f3c6d7..8f0a59915 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example10.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example10.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Object values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\n@Component({\n selector: 'example10-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n // each `value` is an object, so the cell stores the whole airport, not only its name\n readonly airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n ];\n\n readonly shipments = [\n ['Electronics and Gadgets', this.airports[0]],\n ['Medical Supplies', this.airports[1]],\n ['Fresh Produce', this.airports[2]],\n ['Textiles', this.airports[3]],\n ['Pharmaceuticals', this.airports[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example10.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Object values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\n@Component({\n selector: 'example10-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n // each `value` is an object, so the cell stores the whole airport, not only its name\n readonly airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n ];\n\n readonly shipments = [\n ['Electronics and Gadgets', this.airports[0]],\n ['Medical Supplies', this.airports[1]],\n ['Fresh Produce', this.airports[2]],\n ['Textiles', this.airports[3]],\n ['Pharmaceuticals', this.airports[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example10.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example2.ts.json index 5f912da16..d4d3bca36 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n selector: 'example2-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n sanitizer: sanitizeHeader,\n colHeaders: [\n 'Supplier
(allowInvalid false)',\n 'SKU',\n 'Warehouse',\n 'Product
(allowInvalid true)',\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\n@Component({\n selector: 'example2-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n sanitizer: sanitizeHeader,\n colHeaders: [\n 'Supplier
(allowInvalid false)',\n 'SKU',\n 'Warehouse',\n 'Product
(allowInvalid true)',\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example3.ts.json index 642791470..8dbd6c6fa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: (_query: string, process: (items: string[]) => void) => {\n fetch('https://handsontable.com/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n\n readonly data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'autocomplete',\n source: (_query: string, process: (items: string[]) => void) => {\n fetch('https://handsontable.com/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example4.ts.json index 4f7da95bb..116e60bce 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n ['Electronics and Gadgets','Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', 'Chicago O\\'Hare International Airport'],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol']\n ];\n\n readonly airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n 'Chicago O\\'Hare International Airport',\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport'\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n ['Electronics and Gadgets','Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', 'Chicago O\\'Hare International Airport'],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol']\n ];\n\n readonly airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n 'Chicago O\\'Hare International Airport',\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport'\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example5.ts.json index 0143842da..8de98d4a3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n [\n 'Electronics and Gadgets',\n { key: 'LAX', value: 'Los Angeles International Airport' },\n ],\n [\n 'Medical Supplies',\n { key: 'JFK', value: 'John F. Kennedy International Airport' }\n ],\n [\n 'Auto Parts',\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' }\n ],\n [\n 'Fresh Produce',\n { key: 'LHR', value: 'London Heathrow Airport' }\n ],\n [\n 'Textiles',\n { key: 'CDG', value: 'Charles de Gaulle Airport' }\n ],\n [\n 'Industrial Equipment',\n { key: 'DXB', value: 'Dubai International Airport' }\n ],\n [\n 'Pharmaceuticals',\n { key: 'HND', value: 'Tokyo Haneda Airport' }\n ],\n [\n 'Consumer Goods',\n { key: 'PEK', value: 'Beijing Capital International Airport' }\n ],\n [\n 'Machine Parts',\n { key: 'SIN', value: 'Singapore Changi Airport' }\n ],\n [\n 'Food Products',\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' }\n ]\n ];\n\n readonly airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' }\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n [\n 'Electronics and Gadgets',\n { key: 'LAX', value: 'Los Angeles International Airport' },\n ],\n [\n 'Medical Supplies',\n { key: 'JFK', value: 'John F. Kennedy International Airport' }\n ],\n [\n 'Auto Parts',\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' }\n ],\n [\n 'Fresh Produce',\n { key: 'LHR', value: 'London Heathrow Airport' }\n ],\n [\n 'Textiles',\n { key: 'CDG', value: 'Charles de Gaulle Airport' }\n ],\n [\n 'Industrial Equipment',\n { key: 'DXB', value: 'Dubai International Airport' }\n ],\n [\n 'Pharmaceuticals',\n { key: 'HND', value: 'Tokyo Haneda Airport' }\n ],\n [\n 'Consumer Goods',\n { key: 'PEK', value: 'Beijing Capital International Airport' }\n ],\n [\n 'Machine Parts',\n { key: 'SIN', value: 'Singapore Changi Airport' }\n ],\n [\n 'Food Products',\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' }\n ]\n ];\n\n readonly airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' }\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example6.ts.json index 03cb12bd0..55da26a02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly fruits = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n ];\n\n readonly data = [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: this.fruits,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example6.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly fruits = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n ];\n\n readonly data = [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: this.fruits,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example6.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example7.ts.json index 4c47b8f4c..3ffde6094 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example7-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly colors = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n ];\n\n readonly data = [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: this.colors,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example7.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example7-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly colors = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n ];\n\n readonly data = [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: this.colors,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example7.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example8.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example8.ts.json index a2888b893..0e80ffa84 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example8.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example8.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example8-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly statuses = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n ];\n\n readonly data = [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: this.statuses,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example8.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example8-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly statuses = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n ];\n\n readonly data = [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: this.statuses,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example8.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example9.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example9.ts.json index 5e7b73e3d..e01c48059 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example9.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__angular__example9.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example9-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly stockStatuses = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n ];\n\n readonly data = [\n [this.stockStatuses[0], this.stockStatuses[0]],\n [this.stockStatuses[1], this.stockStatuses[1]],\n [this.stockStatuses[2], this.stockStatuses[2]],\n [this.stockStatuses[3], this.stockStatuses[3]],\n [this.stockStatuses[4], this.stockStatuses[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: this.stockStatuses,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example9.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example9-autocomplete-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly stockStatuses = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n ];\n\n readonly data = [\n [this.stockStatuses[0], this.stockStatuses[0]],\n [this.stockStatuses[1], this.stockStatuses[1]],\n [this.stockStatuses[2], this.stockStatuses[2]],\n [this.stockStatuses[3], this.stockStatuses[3]],\n [this.stockStatuses[4], this.stockStatuses[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: this.stockStatuses,\n strict: false,\n },\n {\n type: 'autocomplete',\n source: this.stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/autocomplete-cell-type/angular/example9.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.js.json index 66b9c084d..24a6216ea 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.ts.json index 601519d01..1ab5bcce7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses: string[] = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products: string[] = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses: string[] = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products: string[] = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source: [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ],\n strict: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: false,\n visibleRows: 4,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: false,\n trimDropdown: false,\n width: 120,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.js.json index f83e2fc6b..f096271fb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Object values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10');\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example10.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Object values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10');\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example10.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.ts.json index aaa055a94..11fe5cffa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example10.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Object values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\nconst container = document.querySelector('#example10')!;\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example10.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Object values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\nconst container = document.querySelector('#example10')!;\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example10.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.js.json index 56c4b7c6f..3858cccbd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst suppliers = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n];\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n sanitizer: sanitizeHeader,\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier
(allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)'],\n columns: [\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst suppliers = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n];\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html) => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n sanitizer: sanitizeHeader,\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier
(allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)'],\n columns: [\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.ts.json index 03a34c7eb..b99e54f84 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses: string[] = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products: string[] = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst suppliers: string[] = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n];\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n sanitizer: sanitizeHeader,\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier
(allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)'],\n columns: [\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst warehouses: string[] = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n];\nconst products: string[] = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n];\n\nconst suppliers: string[] = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n];\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n sanitizer: sanitizeHeader,\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier
(allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)'],\n columns: [\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.js.json index f70335a62..2b3c8b242 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source(_query, process) {\n fetch('/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source(_query, process) {\n fetch('/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.ts.json index 51352487b..0983d9646 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source(_query, process) {\n fetch('/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n ],\n colHeaders: ['Supplier', 'SKU', 'Warehouse', 'Product'],\n columns: [\n {\n type: 'autocomplete',\n source(_query, process) {\n fetch('/docs/scripts/json/autocomplete.json')\n .then((response) => response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.js.json index 8c69b130c..6a28ae9de 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.ts.json index 2d27f2dc0..d86d9ae26 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.js.json index 35d71dafd..b8d7de9fa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.ts.json index ba7c8d547..b395d9436 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.js.json index 39d84f7b6..d46f43142 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst fruits = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ],\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // filter: true is the default — only matching options are shown\n },\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example6.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst fruits = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ],\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // filter: true is the default — only matching options are shown\n },\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example6.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.ts.json index 00100b8ef..8b31f43e0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst fruits: string[] = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ],\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // filter: true is the default — only matching options are shown\n },\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example6.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst fruits: string[] = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n ],\n colHeaders: ['Filter: true (default)', 'Filter: false'],\n columns: [\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // filter: true is the default — only matching options are shown\n },\n {\n type: 'autocomplete',\n source: fruits,\n strict: false,\n // don't hide options that don't match the search query\n filter: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example6.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.js.json index 37362d100..3e4b3c505 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst container = document.querySelector('#example7');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ],\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // filteringCaseSensitive: false is the default — typing \"bl\" matches \"Black\" and \"blue\"\n },\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example7.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst container = document.querySelector('#example7');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ],\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // filteringCaseSensitive: false is the default — typing \"bl\" matches \"Black\" and \"blue\"\n },\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example7.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.ts.json index 0935b4e27..cab962fc0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example7.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors: string[] = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst container = document.querySelector('#example7')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ],\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // filteringCaseSensitive: false is the default — typing \"bl\" matches \"Black\" and \"blue\"\n },\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example7.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors: string[] = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst container = document.querySelector('#example7')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n ],\n colHeaders: ['Case-insensitive (default)', 'Case-sensitive'],\n columns: [\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // filteringCaseSensitive: false is the default — typing \"bl\" matches \"Black\" and \"blue\"\n },\n {\n type: 'autocomplete',\n source: colors,\n strict: false,\n // match case while searching autocomplete options\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example7.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.js.json index 6b19e4abc..ea74ab77a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst statuses = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\nconst container = document.querySelector('#example8');\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ],\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sortByRelevance: true is the default — suggestions keep the order from `source`\n },\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example8.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst statuses = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\nconst container = document.querySelector('#example8');\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ],\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sortByRelevance: true is the default — suggestions keep the order from `source`\n },\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example8.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.ts.json index 25423aa5c..79ece1f60 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example8.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst statuses: string[] = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\n\nconst container = document.querySelector('#example8')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ],\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sortByRelevance: true is the default — suggestions keep the order from `source`\n },\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example8.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst statuses: string[] = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\n\nconst container = document.querySelector('#example8')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n ],\n colHeaders: ['Source order (default)', 'Alphabetical order'],\n columns: [\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sortByRelevance: true is the default — suggestions keep the order from `source`\n },\n {\n type: 'autocomplete',\n source: statuses,\n strict: false,\n // sort suggestions alphabetically instead of using the `source` order\n sortByRelevance: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example8.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.js.json index 778afce7d..6dd155bf6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst stockStatuses = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\nconst container = document.querySelector('#example9');\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n ],\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // allowHtml: false is the default — HTML tags in `source` are shown as plain text\n },\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example9.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst stockStatuses = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\nconst container = document.querySelector('#example9');\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n ],\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // allowHtml: false is the default — HTML tags in `source` are shown as plain text\n },\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example9.js","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.ts.json index 22cf60faf..204ea6ace 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__javascript__example9.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst stockStatuses: string[] = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\n\nconst container = document.querySelector('#example9')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n ],\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // allowHtml: false is the default — HTML tags in `source` are shown as plain text\n },\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example9.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst stockStatuses: string[] = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\n\nconst container = document.querySelector('#example9')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n ],\n colHeaders: ['allowHtml: false (default)', 'allowHtml: true'],\n columns: [\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // allowHtml: false is the default — HTML tags in `source` are shown as plain text\n },\n {\n type: 'autocomplete',\n source: stockStatuses,\n strict: false,\n // render `source` values as HTML — only use with trusted, static data\n allowHtml: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/autocomplete-cell-type/javascript/example9.ts","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example1.tsx.json index 5c8df7187..1f33892ff 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n const warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ];\n const products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n const warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ];\n const products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example10.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example10.tsx.json index f27f0a4bf..bb6e7e4c9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example10.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example10.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Object values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example10\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\n// Declared outside the component, so a re-render passes the same arrays and the grid keeps\n// its edits instead of reloading the data and the column settings.\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nconst columns = [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example10.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Object values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example10\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ntype Airport = {\n name: string;\n city: string;\n country: string;\n};\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\n// Declared outside the component, so a re-render passes the same arrays and the grid keeps\n// its edits instead of reloading the data and the column settings.\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nconst columns = [\n {\n title: 'Shipment',\n },\n {\n type: 'autocomplete',\n source: airports,\n // display the city and the name of each airport\n sourceLabel: (airport: Airport) => `${airport.city} - ${airport.name}`,\n title: 'Destination airport',\n width: 400,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example10.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example2.tsx.json index ce45e0c47..4ee38c288 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n const warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ];\n const products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n ];\n\n const suppliers = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ];\n\n return (\n (allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)']}\n columns={[\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ]}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ALLOWED_TAGS = ['BR', 'TABLE', 'THEAD', 'TBODY', 'TR', 'TD', 'TH'];\nconst ALLOWED_ATTRIBUTES = ['colspan', 'rowspan'];\nconst DROPPED_TAGS = ['SCRIPT', 'STYLE', 'TEXTAREA', 'TITLE'];\n\n// Handsontable has no built-in sanitizer since v18.0, and `sanitizer` is grid-level:\n// it also filters pasted HTML, so the table tags have to survive -- otherwise pasting\n// a range degrades to plain text. In production, use a vetted library such as DOMPurify.\n// See https://handsontable.com/docs/security/\nconst sanitizeHeader = (html: string): string => {\n const template = document.createElement('template');\n\n template.innerHTML = html;\n\n template.content.querySelectorAll('*').forEach((element) => {\n if (DROPPED_TAGS.includes(element.tagName)) {\n // Unwrapping these would promote their source text into the output\n element.remove();\n } else if (ALLOWED_TAGS.includes(element.tagName)) {\n Array.from(element.attributes).forEach((attribute) => {\n if (!ALLOWED_ATTRIBUTES.includes(attribute.name)) {\n element.removeAttribute(attribute.name);\n }\n });\n } else {\n // Unwrap a disallowed element, keeping its text content\n element.replaceWith(...Array.from(element.childNodes));\n }\n });\n\n return template.innerHTML;\n};\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n const warehouses = [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ];\n const products = [\n 'Stainless Steel Water Bottle',\n 'Wireless Mouse',\n 'Ergonomic Office Chair',\n 'USB-C Charging Cable',\n 'Aluminum Water Filter',\n 'Canvas Tote Bag',\n 'USB-C Hub',\n 'Ceramic Mug Set',\n 'Desk Lamp',\n 'Laptop Stand',\n 'Bluetooth Speaker',\n 'Standing Desk',\n ];\n\n const suppliers = [\n 'Harbor Goods',\n 'Alpine Supply Co.',\n 'Cascade Distributors',\n 'Summit Trading',\n 'Northgate Wholesale',\n 'Nordic Traders',\n ];\n\n return (\n (allowInvalid false)', 'SKU', 'Warehouse', 'Product
(allowInvalid true)']}\n columns={[\n {\n type: 'autocomplete',\n source: suppliers,\n strict: true,\n allowInvalid: false,\n },\n {},\n {\n type: 'autocomplete',\n source: warehouses,\n strict: true,\n },\n {\n type: 'autocomplete',\n source: products,\n strict: true,\n allowInvalid: true, // true is default\n },\n ]}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example3.tsx.json index 9e339b769..8f9376553 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n return (\n response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ]}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Harbor Goods', 'SKU-4821', 'Seattle', 'Stainless Steel Water Bottle'],\n ['Alpine Supply Co.', 'SKU-0093', 'Denver', 'Wireless Mouse'],\n ['Cascade Distributors', 'SKU-1170', 'Portland', 'Ergonomic Office Chair'],\n ['Summit Trading', 'SKU-2208', 'Austin', 'USB-C Charging Cable'],\n ['Northgate Wholesale', 'SKU-3341', 'Minneapolis', 'Aluminum Water Filter'],\n];\n\nconst ExampleComponent = () => {\n return (\n response.json())\n .then((response) => process(response.data));\n },\n strict: true,\n },\n {}, // SKU is a default text column\n {}, // Warehouse is a default text column\n {}, // Product is a default text column\n ]}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example4.tsx.json index 4d8cd9e7a..78313ec22 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n ];\n\n const airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n ];\n\n const airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example5.tsx.json index 81c57bf87..f0860c4b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n ];\n\n const airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n ];\n\n const airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example6.tsx.json index 20eb68920..f9dd4f0f4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst fruits: string[] = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst data = [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example6.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst fruits: string[] = [\n 'Apple',\n 'Apricot',\n 'Avocado',\n 'Banana',\n 'Blueberry',\n 'Cherry',\n 'Grape',\n 'Lemon',\n 'Lime',\n 'Mango',\n 'Orange',\n 'Peach',\n 'Pear',\n 'Pineapple',\n 'Plum',\n 'Raspberry',\n 'Strawberry',\n 'Watermelon',\n];\n\nconst data = [\n ['Apple', 'Apple'],\n ['Banana', 'Banana'],\n ['Cherry', 'Cherry'],\n ['Mango', 'Mango'],\n ['Orange', 'Orange'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example6.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example7.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example7.tsx.json index 815554e1c..da8aceb7e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example7.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example7.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst colors: string[] = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst data = [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example7.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst colors: string[] = [\n 'Black',\n 'Blue',\n 'brown',\n 'cyan',\n 'Gray',\n 'green',\n 'Lime',\n 'Magenta',\n 'Navy',\n 'olive',\n 'orange',\n 'Pink',\n 'Purple',\n 'Red',\n 'silver',\n 'Teal',\n 'White',\n 'Yellow',\n];\n\nconst data = [\n ['Black', 'Black'],\n ['Blue', 'Blue'],\n ['Gray', 'Gray'],\n ['Red', 'Red'],\n ['White', 'White'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example7.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example8.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example8.tsx.json index dd29dd356..b8990c9b8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example8.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example8.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example8\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst statuses: string[] = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\n\nconst data = [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example8.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example8\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst statuses: string[] = [\n 'Backlog',\n 'In progress',\n 'Blocked',\n 'Done',\n 'Cancelled',\n];\n\nconst data = [\n ['Backlog', 'Backlog'],\n ['In progress', 'In progress'],\n ['Blocked', 'Blocked'],\n ['Done', 'Done'],\n ['Cancelled', 'Cancelled'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example8.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example9.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example9.tsx.json index 64a624bd6..35eaf493b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example9.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__react__example9.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example9\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst stockStatuses: string[] = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\n\nconst data = [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example9.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example9\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst stockStatuses: string[] = [\n 'In stock',\n 'Low stock',\n 'Out of stock',\n 'Backordered',\n 'Discontinued',\n];\n\nconst data = [\n [stockStatuses[0], stockStatuses[0]],\n [stockStatuses[1], stockStatuses[1]],\n [stockStatuses[2], stockStatuses[2]],\n [stockStatuses[3], stockStatuses[3]],\n [stockStatuses[4], stockStatuses[4]],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/autocomplete-cell-type/react/example9.tsx","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example1.vue.json index 8e893b70a..32eee33d9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example10.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example10.vue.json index d70861161..d219e1953 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example10.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example10.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Object values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example10\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example10.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Object values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example10\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example10.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example10","exampleTitle":"Object values","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example2.vue.json index caf6309d4..7f2674cd2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example2","exampleTitle":"Autocomplete strict mode","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example3.vue.json index 0f65a6021..b7eeb0b02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Autocomplete strict mode with asynchronous data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example3","exampleTitle":"Autocomplete strict mode with asynchronous data","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example4.vue.json index ed2463db4..dca7b5ce6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Array of values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example4","exampleTitle":"Array of values","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example5.vue.json index 68e621542..71385c62d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example5","exampleTitle":"Array of objects","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example6.vue.json index 89bc4c756..34ada17dd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example6.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The filter option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example6.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example6","exampleTitle":"The filter option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example7.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example7.vue.json index 89f2ce12c..2b2705d16 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example7.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example7.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example7.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The filteringCaseSensitive option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example7.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example7","exampleTitle":"The filteringCaseSensitive option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example8.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example8.vue.json index 8627dd9a1..7cb3fe661 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example8.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example8.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example8\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example8.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The sortByRelevance option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example8\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example8.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example8","exampleTitle":"The sortByRelevance option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example9.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example9.vue.json index 27d534a5b..eb83aa4ab 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example9.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__autocomplete-cell-type__vue__example9.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example9\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example9.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Autocomplete cell type · The allowHtml option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example9\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/autocomplete-cell-type/vue/example9.vue","breadcrumb":["Cell Types","Autocomplete cell type"],"guide":"guides/cell-types/autocomplete-cell-type/autocomplete-cell-type.md","guideTitle":"Autocomplete cell type","exampleId":"example9","exampleTitle":"The allowHtml option","docPermalink":"/autocomplete-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example1.ts.json index 3c3e0eb04..b41fc7662 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\nconst yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n};\n\nconst colors: string[] = [\n 'yellow',\n 'red',\n 'orange',\n 'green',\n 'blue',\n 'gray',\n 'black',\n 'white',\n];\n\n@Component({\n selector: 'example1-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: 'Ted',\n isActive: true,\n color: 'orange',\n date: '2015-01-01',\n },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n { data: 'date', type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells: (row: number, col: number) => {\n if (row === 0 && col === 0) {\n return { renderer: greenRenderer };\n }\n\n return {};\n },\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example1.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\nconst yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n};\n\nconst colors: string[] = [\n 'yellow',\n 'red',\n 'orange',\n 'green',\n 'blue',\n 'gray',\n 'black',\n 'white',\n];\n\n@Component({\n selector: 'example1-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: 'Ted',\n isActive: true,\n color: 'orange',\n date: '2015-01-01',\n },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n { data: 'date', type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells: (row: number, col: number) => {\n if (row === 0 && col === 0) {\n return { renderer: greenRenderer };\n }\n\n return {};\n },\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example1.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example2.ts.json index 32402a770..92fc3832f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Cell type · Empty cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: [\n 'value underneath',\n 'type:text',\n 'type:numeric',\n 'type:checkbox',\n 'type:dropdown',\n 'type:password',\n ],\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example2.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Cell type · Empty cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: [\n 'value underneath',\n 'type:text',\n 'type:numeric',\n 'type:checkbox',\n 'type:dropdown',\n 'type:password',\n ],\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example2.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example3.ts.json index e3299312e..6ca9b7039 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { CellMeta } from 'handsontable/settings';\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n {\n type: 'intl-date',\n locale: 'en-US',\n dateFormat: { year: 'numeric', month: 'short', day: 'numeric' },\n },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\n@Component({\n selector: 'example3-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: ``,\n})\nexport class AppComponent {\n readonly data = [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells: (row: number, col: number) => (col === 1 ? (valueCellMeta[row] ?? {}) : {}),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example3.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { CellMeta } from 'handsontable/settings';\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n {\n type: 'intl-date',\n locale: 'en-US',\n dateFormat: { year: 'numeric', month: 'short', day: 'numeric' },\n },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\n@Component({\n selector: 'example3-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: ``,\n})\nexport class AppComponent {\n readonly data = [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells: (row: number, col: number) => (col === 1 ? (valueCellMeta[row] ?? {}) : {}),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-types/cell-type/angular/example3.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.js.json index fce2b2732..f5f30a088 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\nconst yellowRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'green';\n};\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: 'Ted', isActive: true, color: 'orange', date: '2015-01-01' },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n {\n data: 'date',\n type: 'intl-date',\n locale: 'en-US',\n dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' },\n },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells(row, col) {\n if (row === 0 && col === 0) {\n this.renderer = greenRenderer;\n\n return { renderer: this.renderer };\n }\n\n return {};\n },\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example1.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\nconst yellowRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'green';\n};\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: 'Ted', isActive: true, color: 'orange', date: '2015-01-01' },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n {\n data: 'date',\n type: 'intl-date',\n locale: 'en-US',\n dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' },\n },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells(row, col) {\n if (row === 0 && col === 0) {\n this.renderer = greenRenderer;\n\n return { renderer: this.renderer };\n }\n\n return {};\n },\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example1.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.ts.json index aea5a5976..e3afc9503 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors: string[] = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\n\nconst yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: 'Ted', isActive: true, color: 'orange', date: '2015-01-01' },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n { data: 'date', type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells(row, col) {\n if (row === 0 && col === 0) {\n this.renderer = greenRenderer;\n\n return { renderer: this.renderer };\n }\n\n return {};\n },\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colors: string[] = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\n\nconst yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n};\n\nconst greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: 'Ted', isActive: true, color: 'orange', date: '2015-01-01' },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n ],\n colHeaders: true,\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id', type: 'text' },\n // 'text' is default, you don't actually need to declare it\n { data: 'name', renderer: yellowRenderer },\n // use default 'text' cell type but overwrite its renderer with yellowRenderer\n { data: 'isActive', type: 'checkbox' },\n { data: 'date', type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: '2-digit', day: '2-digit' } },\n { data: 'color', type: 'autocomplete', source: colors },\n ],\n cell: [{ row: 1, col: 0, renderer: greenRenderer }],\n cells(row, col) {\n if (row === 0 && col === 0) {\n this.renderer = greenRenderer;\n\n return { renderer: this.renderer };\n }\n\n return {};\n },\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.js.json index c58817d56..03c1e720e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Empty cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ],\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: ['value underneath', 'type:text', 'type:numeric', 'type:checkbox', 'type:dropdown', 'type:password'],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example2.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Empty cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ],\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: ['value underneath', 'type:text', 'type:numeric', 'type:checkbox', 'type:dropdown', 'type:password'],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example2.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.ts.json index b4238b05c..4f6ee8330 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Empty cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ],\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: ['value underneath', 'type:text', 'type:numeric', 'type:checkbox', 'type:dropdown', 'type:password'],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Empty cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n ],\n columnSorting: {\n sortEmptyCells: true,\n },\n columns: [\n {\n columnSorting: {\n indicator: false,\n headerAction: false,\n compareFunctionFactory: function compareFunctionFactory() {\n return function comparator() {\n return 0; // Don't sort the first visual column.\n };\n },\n },\n readOnly: true,\n },\n {},\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n { type: 'checkbox' },\n { type: 'dropdown', source: ['yellow', 'red', 'orange'] },\n { type: 'password' },\n ],\n preventOverflow: 'horizontal',\n colHeaders: ['value underneath', 'type:text', 'type:numeric', 'type:checkbox', 'type:dropdown', 'type:password'],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.js.json index 1d9868cb0..ca5fbf70d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ],\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells(row, col) {\n return col === 1 ? (valueCellMeta[row] ?? {}) : {};\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example3.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ],\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells(row, col) {\n return col === 1 ? (valueCellMeta[row] ?? {}) : {};\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/cell-type/javascript/example3.js","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.ts.json index e531f7837..d6e58e916 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ],\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells(row, col) {\n return col === 1 ? (valueCellMeta[row] ?? {}) : {};\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n ],\n colHeaders: ['Setting', 'Value'],\n columns: [{ readOnly: true }, {}],\n cells(row, col) {\n return col === 1 ? (valueCellMeta[row] ?? {}) : {};\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example1.tsx.json index f6ea3b8d0..f8d973ade 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: 'Ted',\n isActive: true,\n color: 'orange',\n date: '2015-01-01',\n },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n];\n\nconst ExampleComponent = () => {\n const colors: string[] = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\n\n const yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n };\n\n const greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example1.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers/textRenderer';\nimport { BaseRenderer } from 'handsontable/renderers';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: 'Ted',\n isActive: true,\n color: 'orange',\n date: '2015-01-01',\n },\n { id: 2, name: 'John', isActive: false, color: 'black', date: null },\n { id: 3, name: 'Al', isActive: true, color: 'red', date: null },\n { id: 4, name: 'Ben', isActive: false, color: 'blue', date: null },\n];\n\nconst ExampleComponent = () => {\n const colors: string[] = ['yellow', 'red', 'orange', 'green', 'blue', 'gray', 'black', 'white'];\n\n const yellowRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n td.style.backgroundColor = 'yellow';\n };\n\n const greenRenderer: BaseRenderer = (instance, td, ...rest) => {\n textRenderer(instance, td, ...rest);\n\n td.style.backgroundColor = 'green';\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example1.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example2.tsx.json index 0ac4cdcc6..a10fef44e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Cell type · Empty cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example2.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Cell type · Empty cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['empty string', '', '', '', '', ''],\n ['null', null, null, null, null, null],\n ['undefined', undefined, undefined, undefined, undefined, undefined],\n ['non-empty value', 'non-empty text', 13000, true, 'orange', 'password'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example2.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example3.tsx.json index 9c0c63baa..b934766aa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst data = [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n];\n\nconst ExampleComponent = () => (\n (col === 1 ? (valueCellMeta[row] ?? {}) : {})}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n);\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example3.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst projectMembers = [\n ['Ana García', 'Product Manager'],\n ['James Okafor', 'Senior Engineer'],\n ['Li Wei', 'UX Designer'],\n];\n\nconst valueCellMeta: CellMeta[] = [\n { type: 'dropdown', source: ['Planning', 'In progress', 'Blocked'] },\n {\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n },\n { type: 'intl-date', locale: 'en-US', dateFormat: { year: 'numeric', month: 'short', day: 'numeric' } },\n { type: 'checkbox' },\n { type: 'text' },\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['Name', 'Role'],\n autoColumnSize: true,\n data: projectMembers,\n getValue() {\n const selection = this.getSelectedLast();\n\n return this.getSourceDataAtCell(Math.max(selection?.[0] ?? 0, 0), 0);\n },\n },\n },\n { type: 'password' },\n];\n\nconst data = [\n ['Status', 'In progress'],\n ['Budget', 250000],\n ['Due date', '2026-09-30'],\n ['Approved', true],\n ['Project name', 'Website redesign'],\n ['Owner', 'Ana García'],\n ['Access code', 'release-2026'],\n];\n\nconst ExampleComponent = () => (\n (col === 1 ? (valueCellMeta[row] ?? {}) : {})}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n);\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/cell-type/react/example3.tsx","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example1.vue.json index bac3cc231..aae370bea 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example1.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example1.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example2.vue.json index b71c64f60..3c288a19f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Cell type · Empty cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example2.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Cell type · Empty cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example2.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example2","exampleTitle":"Empty cells","docPermalink":"/cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example3.vue.json index 3335a067a..869ab23b2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example3.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Cell type · Set different cell types in one column · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/cell-type/vue/example3.vue","breadcrumb":["Cell Types","Cell type"],"guide":"guides/cell-types/cell-type/cell-type.md","guideTitle":"Cell type","exampleId":"example3","exampleTitle":"Set different cell types in one column","docPermalink":"/cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example1.ts.json index bac18f33f..b4af2b9a7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example2.ts.json index 5f5226f82..3357bcb9c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example3.ts.json index 07f5b9dd9..52cf85d40 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example4.ts.json index c2bb79372..fc487884f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value: (function(\n row: number,\n column: number,\n prop: string | number,\n value: unknown\n ) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n }) as unknown as () => string,\n },\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-checkbox-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value: (function(\n row: number,\n column: number,\n prop: string | number,\n value: unknown\n ) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n }) as unknown as () => string,\n },\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example5.ts.json index 7ae1ac887..403342154 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/checkbox-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.js.json index 8fbc0e5bc..c56ad5bc9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.ts.json index 033082469..2e382ff1e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Available'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'available',\n type: 'checkbox',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.js.json index 116f5b83c..4899c067e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.ts.json index 6931968e7..a8887ac6a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year of manufacture', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.js.json index ea374fb25..2eb08d070 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.ts.json index 164923ce7..170995265 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container!, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container!, {\n data: [\n { car: 'Mercedes A 160', year: 2017, available: true, comesInBlack: 'yes' },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n { car: 'Audi A4 Avant', year: 2019, available: true, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, available: false, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, available: false, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Accepted', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'available',\n type: 'checkbox',\n label: {\n position: 'after',\n property: 'car', // Read value from row object\n },\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'before',\n value: 'In black? ',\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.js.json index fea1cb03b..811845bad 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value(row, column, prop, value) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n },\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value(row, column, prop, value) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n },\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.ts.json index 3210de2a5..4aa60ad43 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value(row: number, column: number, prop: string | number, value: string) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n },\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n ],\n colHeaders: ['Car model', 'Year', 'Comes in black'],\n height: 'auto',\n columns: [\n {\n data: 'car',\n },\n {\n data: 'year',\n },\n {\n data: 'comesInBlack',\n type: 'checkbox',\n checkedTemplate: 'yes',\n uncheckedTemplate: 'no',\n label: {\n position: 'after',\n value(row: number, column: number, prop: string | number, value: string) {\n if (value === 'yes') {\n return 'In black';\n } else {\n return 'Not in black';\n }\n },\n },\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.js.json index adac44422..13cde7eab 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ],\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ],\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.ts.json index 997402362..3003a44b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ],\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n ],\n columns: [\n { data: 'task', title: 'Task' },\n { data: 'assignee', title: 'Assignee' },\n {\n data: 'done',\n title: 'Done',\n type: 'checkbox',\n // add a \"check all\" checkbox to the column header\n headerCheckbox: true,\n },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/checkbox-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example1.tsx.json index 84db9fde7..74156f373 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example2.tsx.json index 696267743..e77ea4c68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example3.tsx.json index 6ef7317b9..d7c0d1401 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n available: true,\n comesInBlack: 'yes',\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n available: true,\n comesInBlack: 'no',\n },\n {\n car: 'Opel Astra',\n year: 2020,\n available: false,\n comesInBlack: 'yes',\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n available: false,\n comesInBlack: 'no',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example4.tsx.json index c5a5fb318..e783136a4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { car: 'Mercedes A 160', year: 2017, comesInBlack: 'yes' },\n { car: 'Citroen C4 Coupe', year: 2018, comesInBlack: 'yes' },\n { car: 'Audi A4 Avant', year: 2019, comesInBlack: 'no' },\n { car: 'Opel Astra', year: 2020, comesInBlack: 'yes' },\n { car: 'BMW 320i Coupe', year: 2021, comesInBlack: 'no' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example5.tsx.json index af574984a..614585b1b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { task: 'Update API docs', assignee: 'Ana García', done: true },\n { task: 'Deploy hotfix', assignee: 'James Okafor', done: false },\n { task: 'Review pull request', assignee: 'Li Wei', done: true },\n { task: 'Plan sprint', assignee: 'Ana García', done: false },\n { task: 'Fix login bug', assignee: 'James Okafor', done: false },\n { task: 'Write release notes', assignee: 'Li Wei', done: false },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/checkbox-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example1.vue.json index d1e07c842..4be8e7e45 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example2.vue.json index 74e6661ab..aff762cab 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Checkbox template · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example2","exampleTitle":"Checkbox template","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example3.vue.json index 908b29f0a..b8adad3c9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Checkbox labels · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example3","exampleTitle":"Checkbox labels","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example4.vue.json index 067e84c81..eb9cd5f8b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Label value as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example4","exampleTitle":"Label value as a function","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example5.vue.json index 43157b700..8ccf4462d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__checkbox-cell-type__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Checkbox cell type · Check all in the column header · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/checkbox-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Checkbox cell type"],"guide":"guides/cell-types/checkbox-cell-type/checkbox-cell-type.md","guideTitle":"Checkbox cell type","exampleId":"example5","exampleTitle":"Check all in the column header","docPermalink":"/checkbox-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__angular__example1.ts.json index fad31b270..7754bef21 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Date cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface CarData {\n car: string;\n product_date: string;\n payment_date: string;\n registration_date: string;\n}\n\n@Component({\n selector: 'example1-date-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: CarData[] = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n locale: this.locale,\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: { dateStyle: 'short' },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/date-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Date cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface CarData {\n car: string;\n product_date: string;\n payment_date: string;\n registration_date: string;\n}\n\n@Component({\n selector: 'example1-date-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: CarData[] = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n locale: this.locale,\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: { dateStyle: 'short' },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/date-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.js.json index 760430b83..146db1e8f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Date cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\nconst data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: {\n dateStyle: 'short',\n },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/date-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Date cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\nconst data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: {\n dateStyle: 'short',\n },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/date-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.ts.json index f146f8154..772f54a2d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Date cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\nconst data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: {\n dateStyle: 'short',\n },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/date-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Date cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\nconst data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Product date', 'Payment date', 'Registration date'],\n columns: [\n {\n type: 'text',\n data: 'car',\n },\n {\n type: 'intl-date',\n data: 'product_date',\n dateFormat: {\n dateStyle: 'short',\n },\n },\n {\n type: 'intl-date',\n data: 'payment_date',\n dateFormat: {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n },\n },\n {\n type: 'intl-date',\n data: 'registration_date',\n dateFormat: {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/date-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__react__example1.tsx.json index f8d32a14e..77252495c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Date cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n const data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/date-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Date cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n const data = [\n {\n car: 'Mercedes A 160',\n product_date: '2002-06-15',\n payment_date: '2002-05-20',\n registration_date: '2002-07-01',\n },\n {\n car: 'Citroën C4 Coupe',\n product_date: '2007-03-22',\n payment_date: '2007-02-28',\n registration_date: '2007-04-10',\n },\n {\n car: 'Audi A4 Avant',\n product_date: '2011-09-08',\n payment_date: '2011-08-15',\n registration_date: '2011-09-20',\n },\n {\n car: 'Opel Astra',\n product_date: '2012-01-30',\n payment_date: '2012-01-10',\n registration_date: '2012-02-14',\n },\n {\n car: 'BMW 320i Coupe',\n product_date: '2004-11-12',\n payment_date: '2004-10-20',\n registration_date: '2004-12-01',\n },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/date-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__vue__example1.vue.json index 5d98d3398..d36a3f9da 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__date-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Date cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/date-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Date cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/date-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Date cell type"],"guide":"guides/cell-types/date-cell-type/date-cell-type.md","guideTitle":"Date cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/date-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__angular__example1.ts.json index 92ecbd237..d62d23ae6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Date-time cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-datetime-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: { dateStyle: 'medium', timeStyle: 'short' },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader: (col: number, TH: HTMLTableCellElement) => {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-types/datetime-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Date-time cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-datetime-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: { dateStyle: 'medium', timeStyle: 'short' },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader: (col: number, TH: HTMLTableCellElement) => {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/cell-types/datetime-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.js.json index 9957b2d4c..ff818e272 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Date-time cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all of Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: {\n dateStyle: 'medium',\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader(col, TH) {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/datetime-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Date-time cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all of Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: {\n dateStyle: 'medium',\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader(col, TH) {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/datetime-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.ts.json index 56637c695..756cca0c7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Date-time cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all of Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: {\n dateStyle: 'medium',\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader(col: number, TH: HTMLTableCellElement) {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/datetime-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Date-time cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all of Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Deadline', 'Created'],\n columns: [\n { type: 'text', data: 'task', className: 'htLeft' },\n { type: 'text', data: 'assignee', className: 'htLeft' },\n {\n type: 'intl-datetime',\n data: 'deadline',\n className: 'htLeft',\n width: 190,\n locale: 'en-US',\n dateTimeFormat: {\n dateStyle: 'medium',\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-datetime',\n data: 'created',\n className: 'htLeft',\n width: 165,\n locale: 'en-US',\n dateTimeFormat: {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n },\n },\n ],\n // left-align the column headers (a column's `className` only aligns cell content)\n afterGetColHeader(col: number, TH: HTMLTableCellElement) {\n TH.classList.add('htLeft');\n },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n stretchH: 'all',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/datetime-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__react__example1.tsx.json index 09fd49c51..912f2470e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Date-time cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all of Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\n\nconst ExampleComponent = () => {\n return (\n TH.classList.add('htLeft')}\n columnSorting={true}\n filters={true}\n dropdownMenu={true}\n stretchH=\"all\"\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/datetime-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Date-time cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all of Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { task: 'Design review', assignee: 'Ana García', deadline: '2024-03-15T09:30:00', created: '2024-03-01T08:00:00' },\n { task: 'Sprint demo', assignee: 'James Okafor', deadline: '2024-03-16 14:00:00', created: '2024-03-02T11:20:00' },\n { task: 'Release', assignee: 'Li Wei', deadline: '2024-03-20T23:59:59', created: '2024-03-05T16:45:00' },\n { task: 'Retro', assignee: 'Sofia Rossi', deadline: '2024-03-22', created: '2024-03-06T09:00:00' },\n { task: 'Planning', assignee: 'Noah Cohen', deadline: '2024-03-25T10:15:00', created: '2024-03-08T13:30:00' },\n];\n\nconst ExampleComponent = () => {\n return (\n TH.classList.add('htLeft')}\n columnSorting={true}\n filters={true}\n dropdownMenu={true}\n stretchH=\"all\"\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/datetime-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__vue__example1.vue.json index ce816c167..8bee1e976 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__datetime-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Date-time cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/datetime-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Date-time cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/datetime-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Date-time cell type"],"guide":"guides/cell-types/datetime-cell-type/datetime-cell-type.md","guideTitle":"Date-time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/datetime-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example1.ts.json index 88f31107f..42d2d2f32 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example2.ts.json index fb34fe36e..3f7428386 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Array of values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n ['Electronics and Gadgets','Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', 'Chicago O\\'Hare International Airport'],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol']\n ];\n\n readonly airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n 'Chicago O\\'Hare International Airport',\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport'\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Array of values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n ['Electronics and Gadgets','Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', 'Chicago O\\'Hare International Airport'],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol']\n ];\n\n readonly airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n 'Chicago O\\'Hare International Airport',\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport'\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example3.ts.json index b3ca2918d..9d757d96f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n [\n 'Electronics and Gadgets',\n { key: 'LAX', value: 'Los Angeles International Airport' },\n ],\n [\n 'Medical Supplies',\n { key: 'JFK', value: 'John F. Kennedy International Airport' }\n ],\n [\n 'Auto Parts',\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' }\n ],\n [\n 'Fresh Produce',\n { key: 'LHR', value: 'London Heathrow Airport' }\n ],\n [\n 'Textiles',\n { key: 'CDG', value: 'Charles de Gaulle Airport' }\n ],\n [\n 'Industrial Equipment',\n { key: 'DXB', value: 'Dubai International Airport' }\n ],\n [\n 'Pharmaceuticals',\n { key: 'HND', value: 'Tokyo Haneda Airport' }\n ],\n [\n 'Consumer Goods',\n { key: 'PEK', value: 'Beijing Capital International Airport' }\n ],\n [\n 'Machine Parts',\n { key: 'SIN', value: 'Singapore Changi Airport' }\n ],\n [\n 'Food Products',\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' }\n ]\n ];\n\n readonly airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' }\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n readonly shipmentKVData = [\n [\n 'Electronics and Gadgets',\n { key: 'LAX', value: 'Los Angeles International Airport' },\n ],\n [\n 'Medical Supplies',\n { key: 'JFK', value: 'John F. Kennedy International Airport' }\n ],\n [\n 'Auto Parts',\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' }\n ],\n [\n 'Fresh Produce',\n { key: 'LHR', value: 'London Heathrow Airport' }\n ],\n [\n 'Textiles',\n { key: 'CDG', value: 'Charles de Gaulle Airport' }\n ],\n [\n 'Industrial Equipment',\n { key: 'DXB', value: 'Dubai International Airport' }\n ],\n [\n 'Pharmaceuticals',\n { key: 'HND', value: 'Tokyo Haneda Airport' }\n ],\n [\n 'Consumer Goods',\n { key: 'PEK', value: 'Beijing Capital International Airport' }\n ],\n [\n 'Machine Parts',\n { key: 'SIN', value: 'Singapore Changi Airport' }\n ],\n [\n 'Food Products',\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' }\n ]\n ];\n\n readonly airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: 'Chicago O\\'Hare International Airport' },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' }\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airportKVData,\n title: 'Airport',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example4.ts.json index 94e8fed3a..d612630e1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\n@Component({\n selector: 'example4-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\n@Component({\n selector: 'example4-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example5.ts.json index a575e91ad..50a74c5c1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\n@Component({\n selector: 'example5-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\n@Component({\n selector: 'example5-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example5.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example6.ts.json index 0d63d2294..96665b60a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Object values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n // each `value` is an object, so the cell stores the whole airport, not only its name\n readonly airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n ];\n\n readonly shipments = [\n ['Electronics and Gadgets', this.airports[0]],\n ['Medical Supplies', this.airports[1]],\n ['Fresh Produce', this.airports[2]],\n ['Textiles', this.airports[3]],\n ['Pharmaceuticals', this.airports[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example6.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Dropdown cell type · Object values · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-dropdown-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`\n})\nexport class AppComponent {\n // each `value` is an object, so the cell stores the whole airport, not only its name\n readonly airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n ];\n\n readonly shipments = [\n ['Electronics and Gadgets', this.airports[0]],\n ['Medical Supplies', this.airports[1]],\n ['Fresh Produce', this.airports[2]],\n ['Textiles', this.airports[3]],\n ['Pharmaceuticals', this.airports[4]],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: this.airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/dropdown-cell-type/angular/example6.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.js.json index 8421699ba..e85617ff6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.ts.json index 47389c3d6..388d15453 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {},\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.js.json index ec652a5c0..57502abef 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Array of values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Array of values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.ts.json index 9624e53b5..492a53ed7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Array of values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Array of values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n];\n\nconst airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.js.json index bc3337ed2..efef3230c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.ts.json index 904a7355a..af201aaed 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n];\n\nconst airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipmentKVData,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airportKVData,\n title: 'Airport',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.js.json index e91df958f..9696d3e98 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ],\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ],\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.ts.json index d195d006a..7ea84e9b5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ],\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n ],\n colHeaders: ['Employee', 'Department (default)', 'Department (full width)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // trim the list to the cell's width (default)\n trimDropdown: true,\n },\n {\n type: 'dropdown',\n source: departments,\n width: 140,\n // expand the list to fit its longest option\n trimDropdown: false,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.js.json index 0033e27b3..cac8b7a96 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ],\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ],\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example5.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.ts.json index 9160134fe..043848895 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ],\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n ],\n colHeaders: ['Employee', 'Job title (default)', 'Job title (compact)'],\n columns: [\n {},\n {\n type: 'dropdown',\n source: jobTitles,\n },\n {\n type: 'dropdown',\n source: jobTitles,\n // show 3 options at a time, then scroll\n visibleRows: 3,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example5.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.js.json index 3c818b1d0..0caf3bd77 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Object values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example6.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Dropdown cell type · Object values · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example6.js","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.ts.json index 1e41aa4c1..72c39978e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Object values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example6.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Dropdown cell type · Object values · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: shipments,\n columns: [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/dropdown-cell-type/javascript/example6.ts","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example1.tsx.json index f3405884f..1b342c1e2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example2.tsx.json index b96a40bf6..afc0638fa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Array of values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n ];\n\n const airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Array of values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', 'Los Angeles International Airport'],\n ['Medical Supplies', 'John F. Kennedy International Airport'],\n ['Auto Parts', \"Chicago O'Hare International Airport\"],\n ['Fresh Produce', 'London Heathrow Airport'],\n ['Textiles', 'Charles de Gaulle Airport'],\n ['Industrial Equipment', 'Dubai International Airport'],\n ['Pharmaceuticals', 'Tokyo Haneda Airport'],\n ['Consumer Goods', 'Beijing Capital International Airport'],\n ['Machine Parts', 'Singapore Changi Airport'],\n ['Food Products', 'Amsterdam Airport Schiphol'],\n ];\n\n const airportKVData = [\n 'Los Angeles International Airport',\n 'John F. Kennedy International Airport',\n \"Chicago O'Hare International Airport\",\n 'London Heathrow Airport',\n 'Charles de Gaulle Airport',\n 'Dubai International Airport',\n 'Tokyo Haneda Airport',\n 'Beijing Capital International Airport',\n 'Singapore Changi Airport',\n 'Amsterdam Airport Schiphol',\n 'Frankfurt Airport',\n 'Seoul Incheon International Airport',\n 'Toronto Pearson International Airport',\n 'Madrid-Barajas Airport',\n 'Bangkok Suvarnabhumi Airport',\n 'Munich International Airport',\n 'Sydney Kingsford Smith Airport',\n 'Barcelona-El Prat Airport',\n 'Kuala Lumpur International Airport',\n 'Zurich Airport',\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example3.tsx.json index 488214c8f..4bc9de8f1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n ];\n\n const airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const shipmentKVData = [\n ['Electronics and Gadgets', { key: 'LAX', value: 'Los Angeles International Airport' }],\n ['Medical Supplies', { key: 'JFK', value: 'John F. Kennedy International Airport' }],\n ['Auto Parts', { key: 'ORD', value: \"Chicago O'Hare International Airport\" }],\n ['Fresh Produce', { key: 'LHR', value: 'London Heathrow Airport' }],\n ['Textiles', { key: 'CDG', value: 'Charles de Gaulle Airport' }],\n ['Industrial Equipment', { key: 'DXB', value: 'Dubai International Airport' }],\n ['Pharmaceuticals', { key: 'HND', value: 'Tokyo Haneda Airport' }],\n ['Consumer Goods', { key: 'PEK', value: 'Beijing Capital International Airport' }],\n ['Machine Parts', { key: 'SIN', value: 'Singapore Changi Airport' }],\n ['Food Products', { key: 'AMS', value: 'Amsterdam Airport Schiphol' }],\n ];\n\n const airportKVData = [\n { key: 'LAX', value: 'Los Angeles International Airport' },\n { key: 'JFK', value: 'John F. Kennedy International Airport' },\n { key: 'ORD', value: \"Chicago O'Hare International Airport\" },\n { key: 'LHR', value: 'London Heathrow Airport' },\n { key: 'CDG', value: 'Charles de Gaulle Airport' },\n { key: 'DXB', value: 'Dubai International Airport' },\n { key: 'HND', value: 'Tokyo Haneda Airport' },\n { key: 'PEK', value: 'Beijing Capital International Airport' },\n { key: 'SIN', value: 'Singapore Changi Airport' },\n { key: 'AMS', value: 'Amsterdam Airport Schiphol' },\n { key: 'FRA', value: 'Frankfurt Airport' },\n { key: 'ICN', value: 'Seoul Incheon International Airport' },\n { key: 'YYZ', value: 'Toronto Pearson International Airport' },\n { key: 'MAD', value: 'Madrid-Barajas Airport' },\n { key: 'BKK', value: 'Bangkok Suvarnabhumi Airport' },\n { key: 'MUC', value: 'Munich International Airport' },\n { key: 'SYD', value: 'Sydney Kingsford Smith Airport' },\n { key: 'BCN', value: 'Barcelona-El Prat Airport' },\n { key: 'KUL', value: 'Kuala Lumpur International Airport' },\n { key: 'ZRH', value: 'Zurich Airport' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example4.tsx.json index 4277ecc4a..5ddb4fbec 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\nconst data = [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst departments = [\n 'Engineering and Platform Infrastructure',\n 'Marketing and Brand Communications',\n 'Financial Planning and Analysis',\n 'People Operations and Talent Acquisition',\n 'Customer Success and Enterprise Accounts',\n];\n\nconst data = [\n ['Ana García', departments[0], departments[0]],\n ['James Okafor', departments[1], departments[1]],\n ['Li Wei', departments[2], departments[2]],\n ['Sofia Rossi', departments[3], departments[3]],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example5.tsx.json index 0f25eeb4c..edfadd386 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\nconst data = [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst jobTitles = [\n 'Software Engineer',\n 'Senior Software Engineer',\n 'Staff Engineer',\n 'Engineering Manager',\n 'Product Manager',\n 'Product Designer',\n 'Data Analyst',\n 'Data Scientist',\n 'Marketing Specialist',\n 'Account Executive',\n 'Customer Success Manager',\n 'Finance Analyst',\n 'Recruiter',\n 'Office Manager',\n];\n\nconst data = [\n ['Ana García', 'Senior Software Engineer', 'Senior Software Engineer'],\n ['James Okafor', 'Product Manager', 'Product Manager'],\n ['Li Wei', 'Data Scientist', 'Data Scientist'],\n ['Sofia Rossi', 'Account Executive', 'Account Executive'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example5.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example6.tsx.json index bea28cc12..5b519135f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Object values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\n// Declared outside the component, so a re-render passes the same arrays and the grid keeps\n// its edits instead of reloading the data and the column settings.\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nconst columns = [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example6.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Dropdown cell type · Object values · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// each `value` is an object, so the cell stores the whole airport, not only its name\nconst airports = [\n { key: 'LAX', value: { name: 'Los Angeles International Airport', city: 'Los Angeles', country: 'USA' } },\n { key: 'JFK', value: { name: 'John F. Kennedy International Airport', city: 'New York', country: 'USA' } },\n { key: 'LHR', value: { name: 'London Heathrow Airport', city: 'London', country: 'United Kingdom' } },\n { key: 'CDG', value: { name: 'Charles de Gaulle Airport', city: 'Paris', country: 'France' } },\n { key: 'HND', value: { name: 'Tokyo Haneda Airport', city: 'Tokyo', country: 'Japan' } },\n { key: 'SIN', value: { name: 'Singapore Changi Airport', city: 'Singapore', country: 'Singapore' } },\n];\n\n// Declared outside the component, so a re-render passes the same arrays and the grid keeps\n// its edits instead of reloading the data and the column settings.\nconst shipments = [\n ['Electronics and Gadgets', airports[0]],\n ['Medical Supplies', airports[1]],\n ['Fresh Produce', airports[2]],\n ['Textiles', airports[3]],\n ['Pharmaceuticals', airports[4]],\n];\n\nconst columns = [\n {\n title: 'Shipment',\n },\n {\n type: 'dropdown',\n source: airports,\n // display the `name` property of each airport\n sourceLabel: 'name',\n title: 'Destination airport',\n width: 320,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/dropdown-cell-type/react/example6.tsx","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example1.vue.json index ef04c035b..48599414e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example2.vue.json index 59d35ac06..c27c44aa4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Array of values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Array of values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example2","exampleTitle":"Array of values","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example3.vue.json index 694d2e3a5..8b7404e1a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example4.vue.json index 2ec54b923..a7229e61d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown width · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example4","exampleTitle":"Set the dropdown width","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example5.vue.json index bfb2b75fe..4853cdd12 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Set the dropdown height · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example5.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example5","exampleTitle":"Set the dropdown height","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example6.vue.json index a630dacef..adca74a38 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__dropdown-cell-type__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Object values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example6.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Dropdown cell type · Object values · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/dropdown-cell-type/vue/example6.vue","breadcrumb":["Cell Types","Dropdown cell type"],"guide":"guides/cell-types/dropdown-cell-type/dropdown-cell-type.md","guideTitle":"Dropdown cell type","exampleId":"example6","exampleTitle":"Object values","docPermalink":"/dropdown-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__angular__example1.ts.json index edb363fc3..12c831acd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Handsontable cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\n@Component({\n selector: 'example1-handsontable-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0)) as { name: string };\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/handsontable-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Handsontable cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\n@Component({\n selector: 'example1-handsontable-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0)) as { name: string };\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/handsontable-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.js.json index 43d97a8c9..726b052f9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Handsontable cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0));\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/handsontable-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Handsontable cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0));\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/handsontable-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.ts.json index b97157d5f..325d82975 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Handsontable cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Product {\n sku: string;\n name: string;\n supplier: string;\n}\n\nconst productData: Product[] = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0)) as { name: string };\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/handsontable-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Handsontable cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Product {\n sku: string;\n name: string;\n supplier: string;\n}\n\nconst productData: Product[] = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n columns: [\n {},\n {\n type: 'handsontable',\n handsontable: {\n colHeaders: ['SKU', 'Product', 'Supplier'],\n autoColumnSize: true,\n data: productData,\n getValue() {\n const selection = this.getSelectedLast();\n\n // Get the product name of the clicked row and ignore header\n // coordinates (negative values)\n const row = this.getSourceDataAtRow(Math.max(selection?.[0] ?? 0, 0)) as { name: string };\n\n return row.name;\n },\n },\n },\n {\n type: 'dropdown',\n source: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n {\n type: 'dropdown',\n source: [\n 'Seattle',\n 'Denver',\n 'Portland',\n 'Austin',\n 'Minneapolis',\n 'Boston',\n 'Chicago',\n 'Phoenix',\n 'Atlanta',\n 'Dallas',\n 'San Jose',\n 'Columbus',\n ],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/handsontable-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__react__example1.tsx.json index 993e36d92..2b338e990 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Handsontable cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n const productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/handsontable-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Handsontable cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n const productData = [\n { sku: 'SKU-4821', name: 'Stainless Steel Water Bottle', supplier: 'Harbor Goods' },\n { sku: 'SKU-0093', name: 'Wireless Mouse', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-1170', name: 'Ergonomic Office Chair', supplier: 'Cascade Distributors' },\n { sku: 'SKU-2208', name: 'USB-C Charging Cable', supplier: 'Summit Trading' },\n { sku: 'SKU-3341', name: 'Aluminum Water Filter', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-4412', name: 'Canvas Tote Bag', supplier: 'Nordic Traders' },\n { sku: 'SKU-5088', name: 'USB-C Hub', supplier: 'Harbor Goods' },\n { sku: 'SKU-6120', name: 'Ceramic Mug Set', supplier: 'Alpine Supply Co.' },\n { sku: 'SKU-7294', name: 'Desk Lamp', supplier: 'Cascade Distributors' },\n { sku: 'SKU-8015', name: 'Laptop Stand', supplier: 'Summit Trading' },\n { sku: 'SKU-9166', name: 'Bluetooth Speaker', supplier: 'Northgate Wholesale' },\n { sku: 'SKU-1042', name: 'Standing Desk', supplier: 'Nordic Traders' },\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/handsontable-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__vue__example1.vue.json index 4a28e354e..88afa2d0d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__handsontable-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Handsontable cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/handsontable-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Handsontable cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/handsontable-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Handsontable cell type"],"guide":"guides/cell-types/handsontable-cell-type/handsontable-cell-type.md","guideTitle":"Handsontable cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/handsontable-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example1.ts.json index 0c6ac262d..4ea7c98e9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n ['Chicago O\\'Hare International Airport', ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n];\n\n@Component({\n selector: 'example1-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 300,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example1.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n ['Chicago O\\'Hare International Airport', ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n];\n\n@Component({\n selector: 'example1-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 300,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example1.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example2.ts.json index 14aca2dc6..e11bca11a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n ['Los Angeles International Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ]],\n ['Chicago O\\'Hare International Airport', [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ]],\n ['Charles de Gaulle Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Tokyo Haneda Airport', [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Singapore Changi Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ]],\n];\n\n@Component({\n selector: 'example2-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 300,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example2.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n ['Los Angeles International Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ]],\n ['Chicago O\\'Hare International Airport', [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ]],\n ['Charles de Gaulle Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Tokyo Haneda Airport', [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Singapore Changi Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ]],\n];\n\n@Component({\n selector: 'example2-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 300,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example2.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example3.ts.json index 935f814de..f5772bd08 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Other options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst sortAlphabetically = (entries: string[]) =>\n [...entries].sort((a, b) => String(a).localeCompare(String(b)));\n\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\n@Component({\n selector: 'example3-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: sortAlphabetically,\n filteringCaseSensitive: true,\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 200,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example3.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ MultiSelect cell type · Other options · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst sortAlphabetically = (entries: string[]) =>\n [...entries].sort((a, b) => String(a).localeCompare(String(b)));\n\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\n@Component({\n selector: 'example3-multiselect-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n height: 200,\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: sortAlphabetically,\n filteringCaseSensitive: true,\n },\n ],\n preventOverflow: 'horizontal',\n colWidths: 200,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/multiselect-cell-type/angular/example3.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.js.json index cf309650f..aa98a4a4e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n [\"Chicago O'Hare International Airport\", ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example1.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n [\"Chicago O'Hare International Airport\", ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example1.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.ts.json index cdf93e269..be17a4722 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n ['Chicago O\\'Hare International Airport', ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst shipmentCategories = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n ['Chicago O\\'Hare International Airport', ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.js.json index 6a4259339..1f2b31c9a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n [\n 'Los Angeles International Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ],\n ],\n [\n \"Chicago O'Hare International Airport\",\n [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ],\n ],\n [\n 'Charles de Gaulle Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Tokyo Haneda Airport',\n [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Singapore Changi Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Luton Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ],\n ],\n [\n 'Frankfurt Airport',\n [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Sydney Kingsford Smith Airport',\n [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Toronto Pearson International Airport',\n [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ],\n ],\n [\n 'Hong Kong International Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Heathrow Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example2.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n [\n 'Los Angeles International Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ],\n ],\n [\n \"Chicago O'Hare International Airport\",\n [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ],\n ],\n [\n 'Charles de Gaulle Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Tokyo Haneda Airport',\n [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Singapore Changi Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Luton Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ],\n ],\n [\n 'Frankfurt Airport',\n [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Sydney Kingsford Smith Airport',\n [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Toronto Pearson International Airport',\n [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ],\n ],\n [\n 'Hong Kong International Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Heathrow Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example2.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.ts.json index 48bf76b6b..5d94b3caa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n ['Los Angeles International Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ]],\n ['Chicago O\\'Hare International Airport', [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ]],\n ['Charles de Gaulle Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Tokyo Haneda Airport', [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Singapore Changi Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ]],\n ['Luton Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ]],\n ['Frankfurt Airport', [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Sydney Kingsford Smith Airport', [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ]],\n ['Toronto Pearson International Airport', [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ]],\n ['Hong Kong International Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Heathrow Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst shipmentCategories = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data = [\n ['Los Angeles International Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ]],\n ['Chicago O\\'Hare International Airport', [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ]],\n ['Charles de Gaulle Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Tokyo Haneda Airport', [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Singapore Changi Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ]],\n ['Luton Airport', [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ]],\n ['Frankfurt Airport', [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n ['Sydney Kingsford Smith Airport', [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ]],\n ['Toronto Pearson International Airport', [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ]],\n ['Hong Kong International Airport', [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ]],\n ['Heathrow Airport', [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ]],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n title: 'Airport',\n },\n {\n type: 'multiselect',\n source: shipmentCategories,\n title: 'Shipment',\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.js.json index 17f8e9951..18782bd27 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Other options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: (entries) => [...entries].sort((a, b) => a.localeCompare(b)),\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example3.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ MultiSelect cell type · Other options · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: (entries) => [...entries].sort((a, b) => a.localeCompare(b)),\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example3.js","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.ts.json index 63a438a55..5991550c7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Other options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: (entries: string[]) => [...entries].sort((a, b) => a.localeCompare(b)),\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ MultiSelect cell type · Other options · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nconst requiredItems = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst data = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data,\n columns: [\n {\n type: 'multiselect',\n source: requiredItems,\n title: 'Required items',\n allowEmpty: false,\n },\n {\n type: 'multiselect',\n source: optionalExtras,\n title: 'Optional extras',\n placeholder: 'Select up to 3',\n maxSelections: 3,\n visibleRows: 4,\n searchInput: false,\n },\n {\n type: 'multiselect',\n source: interests,\n title: 'Interests',\n placeholder: 'Select interests',\n sourceSortFunction: (entries: string[]) => [...entries].sort((a, b) => a.localeCompare(b)),\n filteringCaseSensitive: true,\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'last',\n width: '100%',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/multiselect-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example1.tsx.json index d26d1003b..ad691a1e5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst shipmentCategories: string[] = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data: (string | string[])[][] = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n [\"Chicago O'Hare International Airport\", ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example1.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst shipmentCategories: string[] = [\n 'Electronics and Gadgets',\n 'Medical Supplies',\n 'Auto Parts',\n 'Fresh Produce',\n 'Textiles',\n 'Industrial Equipment',\n 'Pharmaceuticals',\n 'Consumer Goods',\n 'Machine Parts',\n 'Food Products',\n];\n\nconst data: (string | string[])[][] = [\n ['Los Angeles International Airport', ['Electronics and Gadgets', 'Medical Supplies']],\n [\"Chicago O'Hare International Airport\", ['Auto Parts', 'Fresh Produce']],\n ['Charles de Gaulle Airport', ['Textiles', 'Industrial Equipment']],\n ['Tokyo Haneda Airport', ['Pharmaceuticals', 'Consumer Goods']],\n ['Singapore Changi Airport', ['Machine Parts', 'Food Products']],\n ['Luton Airport', ['Electronics and Gadgets', 'Pharmaceuticals']],\n ['Frankfurt Airport', ['Industrial Equipment', 'Auto Parts', 'Consumer Goods']],\n ['Sydney Kingsford Smith Airport', ['Fresh Produce', 'Food Products']],\n ['Toronto Pearson International Airport', ['Medical Supplies', 'Textiles']],\n ['Hong Kong International Airport', ['Machine Parts', 'Electronics and Gadgets', 'Industrial Equipment']],\n ['Heathrow Airport', ['Textiles', 'Consumer Goods']],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example1.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example2.tsx.json index 25f2be34b..11f8cfac2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface ShipmentCategory {\n key: string;\n value: string;\n}\n\nconst shipmentCategories: ShipmentCategory[] = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data: (string | ShipmentCategory[])[][] = [\n [\n 'Los Angeles International Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ],\n ],\n [\n \"Chicago O'Hare International Airport\",\n [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ],\n ],\n [\n 'Charles de Gaulle Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Tokyo Haneda Airport',\n [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Singapore Changi Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Luton Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ],\n ],\n [\n 'Frankfurt Airport',\n [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Sydney Kingsford Smith Airport',\n [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Toronto Pearson International Airport',\n [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ],\n ],\n [\n 'Hong Kong International Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Heathrow Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example2.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface ShipmentCategory {\n key: string;\n value: string;\n}\n\nconst shipmentCategories: ShipmentCategory[] = [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n];\n\nconst data: (string | ShipmentCategory[])[][] = [\n [\n 'Los Angeles International Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'medical', value: 'Medical Supplies' },\n ],\n ],\n [\n \"Chicago O'Hare International Airport\",\n [\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'fresh-produce', value: 'Fresh Produce' },\n ],\n ],\n [\n 'Charles de Gaulle Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Tokyo Haneda Airport',\n [\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Singapore Changi Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Luton Airport',\n [\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'pharmaceuticals', value: 'Pharmaceuticals' },\n ],\n ],\n [\n 'Frankfurt Airport',\n [\n { key: 'industrial', value: 'Industrial Equipment' },\n { key: 'auto-parts', value: 'Auto Parts' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n [\n 'Sydney Kingsford Smith Airport',\n [\n { key: 'fresh-produce', value: 'Fresh Produce' },\n { key: 'food', value: 'Food Products' },\n ],\n ],\n [\n 'Toronto Pearson International Airport',\n [\n { key: 'medical', value: 'Medical Supplies' },\n { key: 'textiles', value: 'Textiles' },\n ],\n ],\n [\n 'Hong Kong International Airport',\n [\n { key: 'machine-parts', value: 'Machine Parts' },\n { key: 'electronics', value: 'Electronics and Gadgets' },\n { key: 'industrial', value: 'Industrial Equipment' },\n ],\n ],\n [\n 'Heathrow Airport',\n [\n { key: 'textiles', value: 'Textiles' },\n { key: 'consumer', value: 'Consumer Goods' },\n ],\n ],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example2.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example3.tsx.json index eafa1d5a8..6f91a9dde 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Other options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst requiredItems: string[] = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras: string[] = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests: string[] = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst sortAlphabetically = (entries: (string | object)[]) =>\n [...entries].sort((a, b) => String(a).localeCompare(String(b)));\n\nconst data: string[][][] = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example3.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ MultiSelect cell type · Other options · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst requiredItems: string[] = ['Passport', 'Tickets', 'Wallet', 'Phone', 'Keys'];\nconst optionalExtras: string[] = ['Snacks', 'Book', 'Camera', 'Umbrella', 'First aid kit'];\nconst interests: string[] = ['Art', 'History', 'Nature', 'Food', 'Shopping'];\n\nconst sortAlphabetically = (entries: (string | object)[]) =>\n [...entries].sort((a, b) => String(a).localeCompare(String(b)));\n\nconst data: string[][][] = [\n [['Passport', 'Phone'], ['Snacks', 'Book'], ['Nature']],\n [['Tickets', 'Wallet'], ['Camera'], []],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n [['Phone', 'Keys'], ['First aid kit', 'Snacks', 'Umbrella'], ['Nature']],\n [['Wallet', 'Phone'], [], ['Food', 'Shopping']],\n [['Passport', 'Tickets'], ['Book'], ['Art', 'History']],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/multiselect-cell-type/react/example3.tsx","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example1.vue.json index 486741dc6..06c89660e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example1.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example1.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example2.vue.json index 15bd07774..5b60f4e26 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example2.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example2.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example3.vue.json index 7562ba10f..3322fb817 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__multiselect-cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Other options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example3.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ MultiSelect cell type · Other options · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/multiselect-cell-type/vue/example3.vue","breadcrumb":["Cell Types","MultiSelect cell type"],"guide":"guides/cell-types/multiselect-cell-type/multiselect-cell-type.md","guideTitle":"MultiSelect cell type","exampleId":"example3","exampleTitle":"Other options","docPermalink":"/multiselect-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example1.ts.json index e20b5b6ee..ed4440fdd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Numeric cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface CarData {\n car: string;\n year: number;\n price_usd: number;\n price_eur: number;\n distance_km: number;\n fuel_liters: number;\n discount_percent: number;\n quantity: number;\n}\n\n@Component({\n selector: 'example1-numeric-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: CarData[] = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n locale: this.locale,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ]\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/numeric-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Numeric cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface CarData {\n car: string;\n year: number;\n price_usd: number;\n price_eur: number;\n distance_km: number;\n fuel_liters: number;\n discount_percent: number;\n quantity: number;\n}\n\n@Component({\n selector: 'example1-numeric-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: CarData[] = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n locale: this.locale,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ]\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/numeric-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example2.ts.json index ac42ac2db..a7ae685e1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example2-numeric-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n

{{ readout }}

\n
\n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n readout = 'Edit a cell in the Default or preserveNumericLiteral column to see the stored value.';\n\n readonly data = [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = this.hotTable.hotInstance!.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n this.readout = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n this.cdr.detectChanges();\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/numeric-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example2-numeric-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n \n

{{ readout }}

\n
\n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n readout = 'Edit a cell in the Default or preserveNumericLiteral column to see the stored value.';\n\n readonly data = [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = this.hotTable.hotInstance!.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n this.readout = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n this.cdr.detectChanges();\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/numeric-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.js.json index 27c74f280..ca7936e47 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Numeric cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\n// Sample data with various numeric types\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n];\n\n// Initialize Handsontable\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Numeric cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\n// Sample data with various numeric types\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n];\n\n// Initialize Handsontable\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.ts.json index a133ac042..26eac6a68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Numeric cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\n\n// Sample data with various numeric types\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n];\n\n// Initialize Handsontable\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Numeric cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\n\n// Sample data with various numeric types\nconst data = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n];\n\n// Initialize Handsontable\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Car', 'Year', 'Price (USD)', 'Price (EUR)', 'Distance', 'Fuel', 'Discount', 'Quantity'],\n columns: [\n {\n data: 'car',\n type: 'text',\n },\n {\n data: 'year',\n type: 'numeric',\n },\n {\n data: 'price_usd',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'price_eur',\n type: 'numeric',\n numericFormat: {\n style: 'currency',\n currency: 'EUR',\n minimumFractionDigits: 2,\n },\n },\n {\n data: 'distance_km',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'kilometer',\n useGrouping: true,\n },\n },\n {\n data: 'fuel_liters',\n type: 'numeric',\n numericFormat: {\n style: 'unit',\n unit: 'liter',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n },\n },\n {\n data: 'discount_percent',\n type: 'numeric',\n numericFormat: {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n },\n {\n data: 'quantity',\n type: 'numeric',\n numericFormat: {\n style: 'decimal',\n useGrouping: true,\n minimumFractionDigits: 0,\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.js.json index b31d3b0da..8f2802458 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Edit a cell in the Default or preserveNumericLiteral column to see the stored value.

\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst readout = document.querySelector('#example2-readout');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ],\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange(changes, source) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop;\n const value = hot.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n readout.textContent = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Edit a cell in the Default or preserveNumericLiteral column to see the stored value.

\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst readout = document.querySelector('#example2-readout');\n\nconst hot = new Handsontable(container, {\n data: [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ],\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange(changes, source) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop;\n const value = hot.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n readout.textContent = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.ts.json index 797dd35e7..719706e2b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Edit a cell in the Default or preserveNumericLiteral column to see the stored value.

\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst readout = document.querySelector('#example2-readout')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ],\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange(changes, source) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = hot.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n readout.textContent = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n

Edit a cell in the Default or preserveNumericLiteral column to see the stored value.

\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst readout = document.querySelector('#example2-readout')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n ],\n colHeaders: ['Product', 'Default', 'preserveNumericLiteral: true'],\n columns: [\n { type: 'text', readOnly: true, width: 240 },\n { type: 'numeric' },\n { type: 'numeric', preserveNumericLiteral: true },\n ],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n afterChange(changes, source) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = hot.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n readout.textContent = `${label} stores: ${JSON.stringify(value)} (${typeof value})`;\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/numeric-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example1.tsx.json index 459f27bda..f6a748a6c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Numeric cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface CarData {\n car: string;\n year: number;\n price_usd: number;\n price_eur: number;\n distance_km: number;\n fuel_liters: number;\n discount_percent: number;\n quantity: number;\n}\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n // Sample data with various numeric types\n const data: CarData[] = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/numeric-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Numeric cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface CarData {\n car: string;\n year: number;\n price_usd: number;\n price_eur: number;\n distance_km: number;\n fuel_liters: number;\n discount_percent: number;\n quantity: number;\n}\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n // Sample data with various numeric types\n const data: CarData[] = [\n {\n car: 'Mercedes A 160',\n year: 2017,\n price_usd: 7000,\n price_eur: 7000,\n distance_km: 125000,\n fuel_liters: 45.5,\n discount_percent: 0.15,\n quantity: 1250,\n },\n {\n car: 'Citroen C4 Coupe',\n year: 2018,\n price_usd: 8330,\n price_eur: 8330,\n distance_km: 98000,\n fuel_liters: 52.3,\n discount_percent: 0.08,\n quantity: 2100,\n },\n {\n car: 'Audi A4 Avant',\n year: 2019,\n price_usd: 33900,\n price_eur: 33900,\n distance_km: 45000,\n fuel_liters: 60.0,\n discount_percent: 0.05,\n quantity: 850,\n },\n {\n car: 'Opel Astra',\n year: 2020,\n price_usd: 5000,\n price_eur: 5000,\n distance_km: 156000,\n fuel_liters: 48.7,\n discount_percent: 0.12,\n quantity: 3200,\n },\n {\n car: 'BMW 320i Coupe',\n year: 2021,\n price_usd: 30500,\n price_eur: 30500,\n distance_km: 32000,\n fuel_liters: 55.2,\n discount_percent: 0.03,\n quantity: 1500,\n },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/numeric-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example2.tsx.json index bb59934ef..d47924295 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useState } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n];\n\nconst colHeaders = ['Product', 'Default', 'preserveNumericLiteral: true'];\n\nconst ExampleComponent = () => {\n const [readout, setReadout] = useState('Edit a cell in the Default or preserveNumericLiteral column to see the stored value.');\n\n const afterChange = useCallback(function (\n this: Handsontable,\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = this.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n setReadout(`${label} stores: ${JSON.stringify(value)} (${typeof value})`);\n }, []);\n\n return (\n <>\n \n \n \n \n \n

{readout}

\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/numeric-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useState } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Stainless Steel Water Bottle', 24.5, 24.5],\n ['Wireless Mouse', 18, 18],\n ['USB-C Charging Cable', 9.9, 9.9],\n ['Desk Lamp', 32, 32],\n ['Notebook A5', 4.75, 4.75],\n];\n\nconst colHeaders = ['Product', 'Default', 'preserveNumericLiteral: true'];\n\nconst ExampleComponent = () => {\n const [readout, setReadout] = useState('Edit a cell in the Default or preserveNumericLiteral column to see the stored value.');\n\n const afterChange = useCallback(function (\n this: Handsontable,\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ) {\n if (source === 'loadData' || !changes) {\n return;\n }\n\n const [row, prop] = changes[changes.length - 1];\n const column = prop as number;\n const value = this.getDataAtCell(row, column);\n const label = column === 1 ? 'Default' : 'preserveNumericLiteral';\n\n setReadout(`${label} stores: ${JSON.stringify(value)} (${typeof value})`);\n }, []);\n\n return (\n <>\n \n \n \n \n \n

{readout}

\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/numeric-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example1.vue.json index d7b955bdb..91ab11611 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Numeric cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/numeric-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Numeric cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/numeric-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/numeric-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example2.vue.json index b043db5d5..1af52318d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__numeric-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/numeric-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Numeric cell type · Preserve the typed literal · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/numeric-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Numeric cell type"],"guide":"guides/cell-types/numeric-cell-type/numeric-cell-type.md","guideTitle":"Numeric cell type","exampleId":"example2","exampleTitle":"Preserve the typed literal","docPermalink":"/numeric-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example1.ts.json index 332897608..994e6e309 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example2.ts.json index abd947545..07e8e4944 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Fixed hash length · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Fixed hash length · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example3.ts.json index ee1d2f58a..ce67d37f6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example3.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example4.ts.json index 34cbd3cb3..cb0ed8fb2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Reveal delay · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Password cell type · Reveal delay · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-password-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/password-cell-type/angular/example4.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.js.json index ab408f254..257363aac 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'password', type: 'password' }],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'password', type: 'password' }],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.ts.json index a15fbb9d2..30a08ee8d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'password', type: 'password' }],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'password', type: 'password' }],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.js.json index 08bb4a2fc..4cfd5c762 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Fixed hash length · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Fixed hash length · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.ts.json index 26aa16d1b..84502926e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Fixed hash length · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Fixed hash length · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashLength: 10 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.js.json index 7390dff60..ac1901827 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example3.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.ts.json index 10c1d0324..c669a18aa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashSymbol: '■' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example3.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.js.json index 86cf264d8..face4e827 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Reveal delay · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Password cell type · Reveal delay · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example4.js","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.ts.json index d98275079..43ab6522d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Reveal delay · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Password cell type · Reveal delay · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n ],\n colHeaders: ['ID', 'First name', 'Last name', 'Password'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'password', type: 'password', hashRevealDelay: 1000 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/password-cell-type/javascript/example4.ts","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example1.tsx.json index 523d3ba3a..9cdaf4302 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Password cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Password cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example2.tsx.json index b7d9f0177..850b3f9e8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Password cell type · Fixed hash length · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Password cell type · Fixed hash length · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example3.tsx.json index 3cff2e640..8f6a3427d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n id: 1,\n name: { first: 'Chris', last: 'Right' },\n password: 'plainTextPassword',\n },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example3.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example4.tsx.json index b4147a8f6..7612c3776 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Password cell type · Reveal delay · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Password cell type · Reveal delay · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { id: 1, name: { first: 'Chris', last: 'Right' }, password: 'plainTextPassword' },\n { id: 2, name: { first: 'John', last: 'Honest' }, password: 'txt' },\n { id: 3, name: { first: 'Greg', last: 'Well' }, password: 'longer' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/password-cell-type/react/example4.tsx","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example1.vue.json index ccdc2db95..c19c3191a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/password-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example2.vue.json index 553705d9c..36a405329 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Fixed hash length · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Fixed hash length · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example2","exampleTitle":"Fixed hash length","docPermalink":"/password-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example3.vue.json index 2fa439c6f..10bbc8970 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Custom hash symbol · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example3.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example3","exampleTitle":"Custom hash symbol","docPermalink":"/password-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example4.vue.json index 137ecf1d8..4e8437371 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__password-cell-type__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Reveal delay · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Password cell type · Reveal delay · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/password-cell-type/vue/example4.vue","breadcrumb":["Cell Types","Password cell type"],"guide":"guides/cell-types/password-cell-type/password-cell-type.md","guideTitle":"Password cell type","exampleId":"example4","exampleTitle":"Reveal delay","docPermalink":"/password-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__angular__example1.ts.json index b819919b5..c9f5c916b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Select cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-select-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/select-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Select cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-select-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/select-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.js.json index 2014708f9..c19968f19 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Select cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ],\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/select-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Select cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ],\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/select-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.ts.json index a2a23ca16..c8079340b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Select cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ],\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/select-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Select cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n ],\n colWidths: [90, 210, 110],\n colHeaders: ['SKU', 'Product', 'Category'],\n columns: [\n {},\n {},\n {\n type: 'select',\n selectOptions: ['Drinkware', 'Electronics', 'Furniture', 'Apparel'],\n },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/select-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__react__example1.tsx.json index 957c67c10..0a56eea3b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Select cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/select-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Select cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/select-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__vue__example1.vue.json index c88d2d195..5520d41d3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__select-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Select cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/select-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Select cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/select-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Select cell type"],"guide":"guides/cell-types/select-cell-type/select-cell-type.md","guideTitle":"Select cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/select-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example1.ts.json index b683d3408..4813aaa5b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Text cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-text-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/text-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Text cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-text-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/text-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example2.ts.json index e262aa1bb..2cef976b5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Text cell type · Adding a validator · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst skuValidator = (value: unknown, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(String(value)));\n};\n\n@Component({\n selector: 'example2-text-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/text-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Text cell type · Adding a validator · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\nconst skuValidator = (value: unknown, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(String(value)));\n};\n\n@Component({\n selector: 'example2-text-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/text-cell-type/angular/example2.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.js.json index 49f15cc4b..06bfabd97 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Text cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ],\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Text cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ],\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.ts.json index 677a6da0d..32251a340 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Text cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ],\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Text cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n ],\n colHeaders: ['SKU', 'Category code', 'Quantity', 'Unit price ($)'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n { data: 'unitPrice', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.js.json index 31a6743c9..7cbfb91b8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Text cell type · Adding a validator · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nconst skuValidator = (value, callback) => {\n callback(/^\\d{6}$/.test(value));\n};\nnew Handsontable(container, {\n data: [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ],\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Text cell type · Adding a validator · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nconst skuValidator = (value, callback) => {\n callback(/^\\d{6}$/.test(value));\n};\nnew Handsontable(container, {\n data: [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ],\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example2.js","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.ts.json index 6cc080b48..31f8564e4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Text cell type · Adding a validator · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst skuValidator = (value: string, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(value));\n};\n\nnew Handsontable(container, {\n data: [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ],\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Text cell type · Adding a validator · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nconst skuValidator = (value: string, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(value));\n};\n\nnew Handsontable(container, {\n data: [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n ],\n colHeaders: ['SKU', 'Supplier', 'Quantity'],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n columns: [\n { data: 'sku', type: 'text', validator: skuValidator, allowInvalid: false },\n { data: 'supplier', type: 'text' },\n { data: 'quantity', type: 'numeric' },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/text-cell-type/javascript/example2.ts","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example1.tsx.json index b75588d8e..9cf7ade36 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Text cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/text-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Text cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { sku: '004821', category: '032', quantity: 142, unitPrice: 18.5 },\n { sku: '000093', category: '032', quantity: 0, unitPrice: 42.0 },\n { sku: '017640', category: '015', quantity: 67, unitPrice: 9.99 },\n { sku: '002210', category: '015', quantity: 310, unitPrice: 4.25 },\n { sku: '008875', category: '048', quantity: 24, unitPrice: 129.0 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/text-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example2.tsx.json index c05773408..6129f2af8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Text cell type · Adding a validator · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst skuValidator = (value: string, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(value));\n};\n\nconst data = [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/text-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Text cell type · Adding a validator · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst skuValidator = (value: string, callback: (isValid: boolean) => void) => {\n callback(/^\\d{6}$/.test(value));\n};\n\nconst data = [\n { sku: '004821', supplier: 'Harbor Goods', quantity: 142 },\n { sku: '000093', supplier: 'Alpine Supply Co.', quantity: 0 },\n { sku: '017640', supplier: 'Harbor Goods', quantity: 67 },\n { sku: '002210', supplier: 'Crestline Wholesale', quantity: 310 },\n { sku: '008875', supplier: 'Alpine Supply Co.', quantity: 24 },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/text-cell-type/react/example2.tsx","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example1.vue.json index 0f9bfd6de..d4ffe1939 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Text cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/text-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Text cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/text-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/text-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example2.vue.json index 920245ab0..db481ff72 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__text-cell-type__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Text cell type · Adding a validator · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/text-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Text cell type · Adding a validator · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/text-cell-type/vue/example2.vue","breadcrumb":["Cell Types","Text cell type"],"guide":"guides/cell-types/text-cell-type/text-cell-type.md","guideTitle":"Text cell type","exampleId":"example2","exampleTitle":"Adding a validator","docPermalink":"/text-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__angular__example1.ts.json index 0fdd48826..93498d4d0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Cell Types ▸ Time cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface ShiftData {\n shift: string;\n start: string;\n breakStart: string;\n end: string;\n}\n\n@Component({\n selector: 'example1-time-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: ShiftData[] = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n locale: this.locale,\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/time-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"Angular"} +{"framework":"angular","displayName":"Cell Types ▸ Time cell type · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation, HostListener, ElementRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface ShiftData {\n shift: string;\n start: string;\n breakStart: string;\n end: string;\n}\n\n@Component({\n selector: 'example1-time-cell-type',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
\n
\n
\n \n {{ selectedLabel }}\n \n \n @if (isOpen) {\n
    \n @for (opt of localeOptions; track opt.value) {\n {{ opt.label }}\n }\n
\n }\n
\n
\n
\n
\n \n
\n `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isOpen = false;\n locale = 'en-US';\n\n readonly localeOptions = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n ];\n\n readonly data: ShiftData[] = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n locale: this.locale,\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n get selectedLabel(): string {\n return this.localeOptions.find((o) => o.value === this.locale)?.label || '';\n }\n\n private elementRef = inject(ElementRef);\n\n toggleDropdown(): void {\n this.isOpen = !this.isOpen;\n }\n\n selectLocale(value: string): void {\n this.locale = value;\n this.isOpen = false;\n this.hotTable?.hotInstance?.updateSettings({ locale: this.locale });\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.elementRef.nativeElement.querySelector('.theme-dropdown')?.contains(event.target)) {\n this.isOpen = false;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n this.isOpen = false;\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/cell-types/time-cell-type/angular/example1.ts","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.js.json index 5b0fb3d62..eb644d490 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Cell Types ▸ Time cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n English (United States)\n \n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\nconst data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/time-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"JavaScript"} +{"framework":"javascript","displayName":"Cell Types ▸ Time cell type · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n English (United States)\n \n \n \n
\n
\n
\n \n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst dropdown = document.querySelector('#localeDropdown');\nconst trigger = document.querySelector('#localeTrigger');\nconst menu = document.querySelector('#localeMenu');\nconst label = document.querySelector('#localeLabel');\nconst data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = e.target.closest('li[data-value]');\n\n if (item) {\n label.textContent = item.textContent.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/cell-types/time-cell-type/javascript/example1.js","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.ts.json index ba5409b84..fb9644cdb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Cell Types ▸ Time cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n English (United States)\n \n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\nconst data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/time-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"TypeScript"} +{"framework":"typescript","displayName":"Cell Types ▸ Time cell type · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n English (United States)\n \n \n \n
\n
\n
\n \n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst dropdown = document.querySelector('#localeDropdown')!;\nconst trigger = document.querySelector('#localeTrigger')!;\nconst menu = document.querySelector('#localeMenu')!;\nconst label = document.querySelector('#localeLabel')!;\nconst data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n];\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Shift', 'Start', 'Break start', 'End'],\n columns: [\n {\n type: 'text',\n data: 'shift',\n },\n {\n type: 'intl-time',\n data: 'start',\n timeFormat: {\n timeStyle: 'short',\n },\n },\n {\n type: 'intl-time',\n data: 'breakStart',\n timeFormat: {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n },\n },\n {\n type: 'intl-time',\n data: 'end',\n timeFormat: {\n hour: 'numeric',\n hourCycle: 'h12',\n dayPeriod: 'short',\n },\n },\n ],\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\n// Handle dropdown toggle\ntrigger.addEventListener('click', () => {\n const isOpen = !menu.hidden;\n\n menu.hidden = isOpen;\n trigger.setAttribute('aria-expanded', String(!isOpen));\n});\n\n// Handle locale selection\nmenu.addEventListener('click', (e) => {\n const item = (e.target as HTMLElement).closest('li[data-value]') as HTMLLIElement | null;\n\n if (item) {\n label.textContent = item.textContent!.trim();\n menu.querySelectorAll('li').forEach((li) => li.setAttribute('aria-selected', 'false'));\n item.setAttribute('aria-selected', 'true');\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n hot.updateSettings({ locale: item.dataset.value });\n }\n});\n\n// Close dropdown when clicking outside\ndocument.addEventListener('click', (e) => {\n if (!dropdown.contains(e.target as Node)) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n }\n});\n\n// Close dropdown on Escape key\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && !menu.hidden) {\n menu.hidden = true;\n trigger.setAttribute('aria-expanded', 'false');\n trigger.focus();\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/cell-types/time-cell-type/javascript/example1.ts","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__react__example1.tsx.json index 6a70953d5..38bafc5b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Cell Types ▸ Time cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n const data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/time-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"React (TS)"} +{"framework":"react","displayName":"Cell Types ▸ Time cell type · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst localeOptions: { value: string; label: string }[] = [\n { value: 'ar-AR', label: 'Arabic (Global)' },\n { value: 'cs-CZ', label: 'Czech (Czechia)' },\n { value: 'de-CH', label: 'German (Switzerland)' },\n { value: 'de-DE', label: 'German (Germany)' },\n { value: 'en-US', label: 'English (United States)' },\n { value: 'es-MX', label: 'Spanish (Mexico)' },\n { value: 'fa-IR', label: 'Persian (Iran)' },\n { value: 'fr-FR', label: 'French (France)' },\n { value: 'hr-HR', label: 'Croatian (Croatia)' },\n { value: 'it-IT', label: 'Italian (Italy)' },\n { value: 'ja-JP', label: 'Japanese (Japan)' },\n { value: 'ko-KR', label: 'Korean (Korea)' },\n { value: 'lv-LV', label: 'Latvian (Latvia)' },\n { value: 'nb-NO', label: 'Norwegian Bokmal (Norway)' },\n { value: 'nl-NL', label: 'Dutch (Netherlands)' },\n { value: 'pl-PL', label: 'Polish (Poland)' },\n { value: 'pt-BR', label: 'Portuguese (Brazil)' },\n { value: 'ru-RU', label: 'Russian (Russia)' },\n { value: 'sr-Latn-RS', label: 'Serbian Latin (Serbia)' },\n { value: 'zh-CN', label: 'Chinese (Simplified, China)' },\n { value: 'zh-TW', label: 'Chinese (Traditional, Taiwan)' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const dropdownRef = useRef(null);\n const [isOpen, setIsOpen] = useState(false);\n const [locale, setLocale] = useState('en-US');\n\n useEffect(() => {\n const handleOutsideClick = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleOutsideClick);\n document.addEventListener('keydown', handleEscape);\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n document.removeEventListener('keydown', handleEscape);\n };\n }, []);\n\n const handleSelect = (value: string) => {\n setLocale(value);\n setIsOpen(false);\n hotRef.current?.hotInstance?.updateSettings({ locale: value } as Handsontable.GridSettings);\n };\n\n const selectedLabel = localeOptions.find((o) => o.value === locale)?.label;\n\n const data = [\n { shift: 'Morning', start: '09:00', breakStart: '12:00', end: '17:00' },\n { shift: 'Afternoon', start: '13:30', breakStart: '16:00', end: '21:00' },\n { shift: 'Night', start: '22:00', breakStart: '01:00', end: '06:00' },\n { shift: 'Split', start: '08:00', breakStart: '12:30', end: '20:00' },\n { shift: 'Short day', start: '10:00', breakStart: '13:00', end: '15:00' },\n ];\n\n return (\n <>\n
\n
\n
\n setIsOpen(!isOpen)}\n >\n {selectedLabel}\n \n \n {isOpen && (\n
    \n {localeOptions.map((opt) => (\n handleSelect(opt.value)}\n >\n {opt.label}\n \n ))}\n
\n )}\n
\n
\n
\n\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/cell-types/time-cell-type/react/example1.tsx","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__vue__example1.vue.json index 06d10641b..42ffdf7e3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__cell-types__time-cell-type__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Cell Types ▸ Time cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/time-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"Vue 3"} +{"framework":"vue","displayName":"Cell Types ▸ Time cell type · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/cell-types/time-cell-type/vue/example1.vue","breadcrumb":["Cell Types","Time cell type"],"guide":"guides/cell-types/time-cell-type/time-cell-type.md","guideTitle":"Time cell type","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/time-cell-type","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example1.ts.json index 18eb8d2b5..470f9df6f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Adding and removing columns · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-column-adding',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n \n
\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n insertColumn(): void {\n const hot = this.hotTable?.hotInstance;\n\n // insert one column at the end of the grid\n hot?.alter('insert_col_end', hot.countCols() - 1, 1);\n }\n\n removeColumn(): void {\n const hot = this.hotTable?.hotInstance;\n\n // remove the last column, but keep at least one column in the grid\n if (hot && hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-adding/angular/example1.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Adding and removing columns · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-column-adding',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n \n
\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n insertColumn(): void {\n const hot = this.hotTable?.hotInstance;\n\n // insert one column at the end of the grid\n hot?.alter('insert_col_end', hot.countCols() - 1, 1);\n }\n\n removeColumn(): void {\n const hot = this.hotTable?.hotInstance;\n\n // remove the last column, but keep at least one column in the grid\n if (hot && hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-adding/angular/example1.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example2.ts.json index 0f1dfafb0..341052ccb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-column-adding',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-adding/angular/example2.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-column-adding',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-adding/angular/example2.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.js.json index 9ad7057ce..37b4dd1f3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Adding and removing columns · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst insertButton = document.querySelector('#insert-column');\nconst removeButton = document.querySelector('#remove-column');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\ninsertButton.addEventListener('click', () => {\n // insert one column at the end of the grid\n hot.alter('insert_col_end', hot.countCols() - 1, 1);\n});\nremoveButton.addEventListener('click', () => {\n // remove the last column, but keep at least one column in the grid\n if (hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-adding/javascript/example1.js","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Adding and removing columns · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\nconst insertButton = document.querySelector('#insert-column');\nconst removeButton = document.querySelector('#remove-column');\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\ninsertButton.addEventListener('click', () => {\n // insert one column at the end of the grid\n hot.alter('insert_col_end', hot.countCols() - 1, 1);\n});\nremoveButton.addEventListener('click', () => {\n // remove the last column, but keep at least one column in the grid\n if (hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-adding/javascript/example1.js","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.ts.json index de79a2bef..e62c638c1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Adding and removing columns · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst insertButton = document.querySelector('#insert-column')!;\nconst removeButton = document.querySelector('#remove-column')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ninsertButton.addEventListener('click', () => {\n // insert one column at the end of the grid\n hot.alter('insert_col_end', hot.countCols() - 1, 1);\n});\n\nremoveButton.addEventListener('click', () => {\n // remove the last column, but keep at least one column in the grid\n if (hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-adding/javascript/example1.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Adding and removing columns · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst insertButton = document.querySelector('#insert-column')!;\nconst removeButton = document.querySelector('#remove-column')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ninsertButton.addEventListener('click', () => {\n // insert one column at the end of the grid\n hot.alter('insert_col_end', hot.countCols() - 1, 1);\n});\n\nremoveButton.addEventListener('click', () => {\n // remove the last column, but keep at least one column in the grid\n if (hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-adding/javascript/example1.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.js.json index b01849d69..81ccf2cfe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-adding/javascript/example2.js","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register all Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-adding/javascript/example2.js","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.ts.json index 5ecdd9b22..76c46d64b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-adding/javascript/example2.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register all Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n ],\n colHeaders: ['Name', 'Department', 'Title', 'Hire date'],\n rowHeaders: true,\n height: 'auto',\n // show only the column insert and remove items in the context menu\n contextMenu: ['col_left', 'col_right', 'remove_col'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-adding/javascript/example2.ts","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example1.tsx.json index ee5b4127d..d21175675 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Adding and removing columns · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const insertColumn = () => {\n const hot = hotRef.current?.hotInstance;\n\n // insert one column at the end of the grid\n hot?.alter('insert_col_end', hot.countCols() - 1, 1);\n };\n\n const removeColumn = () => {\n const hot = hotRef.current?.hotInstance;\n\n // remove the last column, but keep at least one column in the grid\n if (hot && hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-adding/react/example1.tsx","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Adding and removing columns · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const insertColumn = () => {\n const hot = hotRef.current?.hotInstance;\n\n // insert one column at the end of the grid\n hot?.alter('insert_col_end', hot.countCols() - 1, 1);\n };\n\n const removeColumn = () => {\n const hot = hotRef.current?.hotInstance;\n\n // remove the last column, but keep at least one column in the grid\n if (hot && hot.countCols() > 1) {\n hot.alter('remove_col', hot.countCols() - 1, 1);\n }\n };\n\n return (\n <>\n
\n
\n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-adding/react/example1.tsx","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example2.tsx.json index f63b9e5db..4a0a2753c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-adding/react/example2.tsx","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Ana García', 'Engineering', 'Senior Engineer', '2021-04-12'],\n ['James Okafor', 'Marketing', 'Product Manager', '2022-08-30'],\n ['Li Wei', 'Engineering', 'Staff Engineer', '2019-02-18'],\n ['Sofia Rossi', 'Sales', 'Account Executive', '2023-01-09'],\n ['Diego Fernández', 'Design', 'UX Designer', '2020-11-23'],\n ['Amara Singh', 'Engineering', 'Engineering Manager', '2018-06-05'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-adding/react/example2.tsx","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example1.vue.json index 3b9aa5651..f01a0aaaa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Adding and removing columns · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-adding/vue/example1.vue","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Adding and removing columns · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-adding/vue/example1.vue","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-adding","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example2.vue.json index 4ba6656a7..a7c76c489 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-adding__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-adding/vue/example2.vue","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Adding and removing columns · Add and remove columns from the context menu · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-adding/vue/example2.vue","breadcrumb":["Columns","Adding and removing columns"],"guide":"guides/columns/column-adding/column-adding.md","guideTitle":"Adding and removing columns","exampleId":"example2","exampleTitle":"Add and remove columns from the context menu","docPermalink":"/column-adding","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example1.ts.json index a9618db37..de2b0abce 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example1.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example1.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example10.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example10.ts.json index 1efaa245c..8eb6be9fd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example10.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example10.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Server-side filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example10',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack: { column: number; conditions: unknown[]; operation: string }[]) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(\n `The amount of filters added to this column: ${lastChanged.conditions.length}`\n );\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example10.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example10","exampleTitle":"Server-side filtering (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Server-side filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example10',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack: { column: number; conditions: unknown[]; operation: string }[]) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(\n `The amount of filters added to this column: ${lastChanged.conditions.length}`\n );\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example10.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example10","exampleTitle":"Server-side filtering (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example11.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example11.ts.json index 7513b8330..750e0527d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example11.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example11.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Filter data programmatically (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport { Filters } from 'handsontable/plugins';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example11',\n template: `\n
\n
\n \n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n // get the `Filters` plugin, so you can use its API\n getFiltersPlugin(): Filters {\n return this.hotTable.hotInstance!.getPlugin('filters');\n }\n\n filterBelow200() {\n const filters = this.getFiltersPlugin();\n\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n }\n\n filterAbove200() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n }\n\n clearAllFilters() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n filters.filter();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example11.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example11","exampleTitle":"Filter data programmatically (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Filter data programmatically (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport { Filters } from 'handsontable/plugins';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example11',\n template: `\n
\n
\n \n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n // get the `Filters` plugin, so you can use its API\n getFiltersPlugin(): Filters {\n return this.hotTable.hotInstance!.getPlugin('filters');\n }\n\n filterBelow200() {\n const filters = this.getFiltersPlugin();\n\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n }\n\n filterAbove200() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n }\n\n clearAllFilters() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n filters.filter();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example11.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example11","exampleTitle":"Filter data programmatically (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example12.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example12.ts.json index 77f4c61c5..91909a4ac 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example12.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example12.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example12',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply'\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example12.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example12","exampleTitle":"Enable filtering within already filtered results (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example12',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply'\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example12.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example12","exampleTitle":"Enable filtering within already filtered results (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example13.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example13.ts.json index 2f078b112..aa5c17b0c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example13.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example13.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Save and restore filter settings (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { Filters } from 'handsontable/plugins';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example13',\n template: `\n
\n
\n \n \n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n savedConditions: ColumnConditions[] = [];\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n // get the `Filters` plugin, so you can use its API\n getFiltersPlugin(): Filters {\n return this.hotTable.hotInstance!.getPlugin('filters');\n }\n\n applySampleFilter() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n }\n\n saveFilters() {\n const filters = this.getFiltersPlugin();\n\n // `exportConditions()` returns the current conditions, keyed by physical column index\n this.savedConditions = filters.exportConditions();\n }\n\n clearFilters() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n filters.filter();\n }\n\n restoreFilters() {\n const filters = this.getFiltersPlugin();\n\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(this.savedConditions);\n filters.filter();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example13.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example13","exampleTitle":"Save and restore filter settings (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Save and restore filter settings (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { Filters } from 'handsontable/plugins';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example13',\n template: `\n
\n
\n \n \n \n \n
\n
\n\n \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n savedConditions: ColumnConditions[] = [];\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n // get the `Filters` plugin, so you can use its API\n getFiltersPlugin(): Filters {\n return this.hotTable.hotInstance!.getPlugin('filters');\n }\n\n applySampleFilter() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n }\n\n saveFilters() {\n const filters = this.getFiltersPlugin();\n\n // `exportConditions()` returns the current conditions, keyed by physical column index\n this.savedConditions = filters.exportConditions();\n }\n\n clearFilters() {\n const filters = this.getFiltersPlugin();\n\n filters.clearConditions();\n filters.filter();\n }\n\n restoreFilters() {\n const filters = this.getFiltersPlugin();\n\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(this.savedConditions);\n filters.filter();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example13.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example13","exampleTitle":"Save and restore filter settings (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example14.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example14.ts.json index 5d353f0ee..d1f5fdc69 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example14.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example14.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Get filtered data (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, inject } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example14',\n template: `\n

{{ rowCountInfo }}

\n\n \n \n `,\n})\nexport class AppComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n rowCountInfo = '';\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings;\n\n constructor() {\n // deferred so the update doesn't trigger NG0100 when `afterInit` fires\n // during the same change-detection cycle that first rendered the template\n const updateRowCountInfo = (hotInstance: Handsontable) => {\n setTimeout(() => {\n // `getData()` returns only the rows that pass the current filters\n // `getSourceData()` always returns every row, filtered or not\n this.rowCountInfo = `Showing ${hotInstance.getData().length} of ${hotInstance.getSourceData().length} rows.`;\n // Nothing marks the OnPush-by-default component dirty here, so mark it.\n this.cdr.markForCheck();\n }, 0);\n };\n\n this.hotSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` and `afterFilter()` are Handsontable hooks\n afterInit(this: Handsontable) {\n updateRowCountInfo(this);\n },\n afterFilter(this: Handsontable) {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example14.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example14","exampleTitle":"Get filtered data (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Get filtered data (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, inject } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example14',\n template: `\n

{{ rowCountInfo }}

\n\n \n \n `,\n})\nexport class AppComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n rowCountInfo = '';\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings;\n\n constructor() {\n // deferred so the update doesn't trigger NG0100 when `afterInit` fires\n // during the same change-detection cycle that first rendered the template\n const updateRowCountInfo = (hotInstance: Handsontable) => {\n setTimeout(() => {\n // `getData()` returns only the rows that pass the current filters\n // `getSourceData()` always returns every row, filtered or not\n this.rowCountInfo = `Showing ${hotInstance.getData().length} of ${hotInstance.getSourceData().length} rows.`;\n // Nothing marks the OnPush-by-default component dirty here, so mark it.\n this.cdr.markForCheck();\n }, 0);\n };\n\n this.hotSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` and `afterFilter()` are Handsontable hooks\n afterInit(this: Handsontable) {\n updateRowCountInfo(this);\n },\n afterFilter(this: Handsontable) {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example14.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example14","exampleTitle":"Get filtered data (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example15.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example15.ts.json index 74ab05dce..807da4efa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example15.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example15.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example15',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example15.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example15","exampleTitle":"Enable filtering for individual columns (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example15',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example15.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example15","exampleTitle":"Enable filtering for individual columns (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example16.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example16.ts.json index cc9c907f2..e6bc2d6ca 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example16.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example16.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Change the order of values in the filter list (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example16',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example16.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example16","exampleTitle":"Change the order of values in the filter list (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Change the order of values in the filter list (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example16',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example16.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example16","exampleTitle":"Change the order of values in the filter list (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example17.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example17.ts.json index 2af5e06af..1dace23de 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example17.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example17.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example17',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example17.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example17","exampleTitle":"Choose the conditions the filter menu offers (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example17',\n template: `\n \n \n `,\n})\nexport class AppComponent {\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example17.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example17","exampleTitle":"Choose the conditions the filter menu offers (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example18.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example18.ts.json index 6db247bea..3ebcb3320 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example18.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example18.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Filtering with nested headers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example18',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ];\n\n readonly hotSettings: GridSettings = {\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example18.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example18","exampleTitle":"Filtering with nested headers (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Filtering with nested headers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example18',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ];\n\n readonly hotSettings: GridSettings = {\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example18.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example18","exampleTitle":"Filtering with nested headers (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example2.ts.json index e107a8a7e..e59d4f549 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example2.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example2","exampleTitle":"Enable filtering (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example2.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example2","exampleTitle":"Enable filtering (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example3.ts.json index d541bfb60..5cbff9894 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (4) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col: number, TH: HTMLElement) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement?.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example3.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example3","exampleTitle":"Enable filtering for individual columns (4)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (4) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden(this: Handsontable) {\n const col = this.getSelectedRangeLast()?.to.col;\n return col != null && col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col: number, TH: HTMLElement) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement?.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example3.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example3","exampleTitle":"Enable filtering for individual columns (4)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example4.ts.json index 1251a917c..c7468f0f8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Filter different types of data (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example4.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example4","exampleTitle":"Filter different types of data (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Filter different types of data (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example4.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example4","exampleTitle":"Filter different types of data (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example5.ts.json index 795a38e53..525dc9266 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Filter data on initialization (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit(this: Handsontable) {\n // get the `Filters` plugin, so you can use its API\n const filters = this.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example5.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example5","exampleTitle":"Filter data on initialization (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Filter data on initialization (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport Handsontable from 'handsontable';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit(this: Handsontable) {\n // get the `Filters` plugin, so you can use its API\n const filters = this.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example5.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example5","exampleTitle":"Filter data on initialization (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example6.ts.json index 874be0be5..a1fcccb56 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · External quick filter (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, HostListener, ViewChild, ViewEncapsulation } from \"@angular/core\";\nimport { GridSettings, HotTableComponent, HotTableModule } from \"@handsontable/angular-wrapper\";\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: \"app-example6\",\n encapsulation: ViewEncapsulation.None,\n styles: `\n .controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n\n .selectColumn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #555555;\n white-space: nowrap;\n }\n\n .selectColumn select {\n border: 1px solid #e0e0e0;\n background: none;\n color: #333333;\n font-size: 0.875rem;\n padding: 0.4rem 0.625rem;\n outline: none;\n border-radius: 0;\n cursor: pointer;\n }\n\n .selectColumn select:focus {\n border-color: #1A42E8;\n }\n\n #filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n }\n\n #filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n #filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n #filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n\n .filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n }\n\n .filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n }\n\n .filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n }\n\n .filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n }\n\n .filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n }\n\n .filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n }\n\n .filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n }\n\n .filter-dropdown-menu li:last-child {\n border-bottom: none;\n }\n\n .filter-dropdown-menu li:hover,\n .filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n }\n\n .filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n `,\n template: `\n
\n
\n
\n \n \n {{ selectedLabel }}\n \n \n \n \n @if (isOpen) {\n
    \n @for (option of columnOptions; track option.value) {\n \n {{ option.label }}\n \n }\n
\n }\n
\n \n
\n
\n\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n isOpen = false;\n selectedColumn = 0;\n\n readonly columnOptions: Array<{ value: string; label: string }> = [\n { value: \"0\", label: \"Brand\" },\n { value: \"1\", label: \"Model\" },\n { value: \"2\", label: \"Price\" },\n { value: \"3\", label: \"Date\" },\n { value: \"4\", label: \"Time\" },\n { value: \"5\", label: \"In stock\" },\n ];\n\n get selectedLabel(): string {\n return this.columnOptions.find((o) => o.value === this.selectedColumn.toString())?.label ?? \"Brand\";\n }\n\n @HostListener(\"document:click\")\n closeDropdown() {\n this.isOpen = false;\n }\n\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n }\n\n selectColumn(option: { value: string; label: string }) {\n this.selectedColumn = Number(option.value);\n this.isOpen = false;\n }\n\n handleFilter(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n const filters = this.hotTable.hotInstance!.getPlugin(\"filters\");\n\n filters.removeConditions(this.selectedColumn);\n filters.addCondition(this.selectedColumn, \"contains\", [value]);\n filters.filter();\n this.hotTable.hotInstance!.render();\n }\n\n readonly hotData = [\n {\n brand: \"Jetpulse\",\n model: \"Racing Socks\",\n price: 30,\n sellDate: \"2023-10-11\",\n sellTime: \"01:23\",\n inStock: false,\n },\n {\n brand: \"Gigabox\",\n model: \"HL Mountain Frame\",\n price: 1890.9,\n sellDate: \"2023-05-03\",\n sellTime: \"11:27\",\n inStock: false,\n },\n {\n brand: \"Camido\",\n model: \"Cycling Cap\",\n price: 130.1,\n sellDate: \"2023-03-27\",\n sellTime: \"03:17\",\n inStock: true,\n },\n {\n brand: \"Chatterpoint\",\n model: \"Road Tire Tube\",\n price: 59,\n sellDate: \"2023-08-28\",\n sellTime: \"08:01\",\n inStock: true,\n },\n {\n brand: \"Eidel\",\n model: \"HL Road Tire\",\n price: 279.99,\n sellDate: \"2023-10-02\",\n sellTime: \"13:23\",\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: \"Brand\",\n type: \"text\",\n data: \"brand\",\n },\n {\n title: \"Model\",\n type: \"text\",\n data: \"model\",\n },\n {\n title: \"Price\",\n type: \"numeric\",\n data: \"price\",\n locale: \"en-US\",\n numericFormat: {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n },\n },\n {\n title: \"Date\",\n type: \"intl-date\",\n data: \"sellDate\",\n locale: \"en-GB\",\n dateFormat: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n className: \"htRight\",\n },\n {\n title: \"Time\",\n type: \"intl-time\",\n data: \"sellTime\",\n locale: \"en-GB\",\n timeFormat: { hour: \"2-digit\", minute: \"2-digit\", hour12: false },\n className: \"htRight\",\n },\n {\n title: \"In stock\",\n type: \"checkbox\",\n data: \"inStock\",\n className: \"htCenter\",\n },\n ],\n colHeaders: true,\n height: \"auto\",\n filters: true,\n className: \"exampleQuickFilter\",\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example6.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example6","exampleTitle":"External quick filter (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · External quick filter (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, HostListener, ViewChild, ViewEncapsulation } from \"@angular/core\";\nimport { GridSettings, HotTableComponent, HotTableModule } from \"@handsontable/angular-wrapper\";\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: \"app-example6\",\n encapsulation: ViewEncapsulation.None,\n styles: `\n .controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n\n .selectColumn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #555555;\n white-space: nowrap;\n }\n\n .selectColumn select {\n border: 1px solid #e0e0e0;\n background: none;\n color: #333333;\n font-size: 0.875rem;\n padding: 0.4rem 0.625rem;\n outline: none;\n border-radius: 0;\n cursor: pointer;\n }\n\n .selectColumn select:focus {\n border-color: #1A42E8;\n }\n\n #filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n }\n\n #filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n #filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n #filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n\n .filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n }\n\n .filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n }\n\n .filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n }\n\n .filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n }\n\n .filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n }\n\n .filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n }\n\n .filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n }\n\n .filter-dropdown-menu li:last-child {\n border-bottom: none;\n }\n\n .filter-dropdown-menu li:hover,\n .filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n }\n\n .filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n `,\n template: `\n
\n
\n
\n \n \n {{ selectedLabel }}\n \n \n \n \n @if (isOpen) {\n
    \n @for (option of columnOptions; track option.value) {\n \n {{ option.label }}\n \n }\n
\n }\n
\n \n
\n
\n\n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) hotTable!: HotTableComponent;\n\n isOpen = false;\n selectedColumn = 0;\n\n readonly columnOptions: Array<{ value: string; label: string }> = [\n { value: \"0\", label: \"Brand\" },\n { value: \"1\", label: \"Model\" },\n { value: \"2\", label: \"Price\" },\n { value: \"3\", label: \"Date\" },\n { value: \"4\", label: \"Time\" },\n { value: \"5\", label: \"In stock\" },\n ];\n\n get selectedLabel(): string {\n return this.columnOptions.find((o) => o.value === this.selectedColumn.toString())?.label ?? \"Brand\";\n }\n\n @HostListener(\"document:click\")\n closeDropdown() {\n this.isOpen = false;\n }\n\n toggleDropdown() {\n this.isOpen = !this.isOpen;\n }\n\n selectColumn(option: { value: string; label: string }) {\n this.selectedColumn = Number(option.value);\n this.isOpen = false;\n }\n\n handleFilter(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n const filters = this.hotTable.hotInstance!.getPlugin(\"filters\");\n\n filters.removeConditions(this.selectedColumn);\n filters.addCondition(this.selectedColumn, \"contains\", [value]);\n filters.filter();\n this.hotTable.hotInstance!.render();\n }\n\n readonly hotData = [\n {\n brand: \"Jetpulse\",\n model: \"Racing Socks\",\n price: 30,\n sellDate: \"2023-10-11\",\n sellTime: \"01:23\",\n inStock: false,\n },\n {\n brand: \"Gigabox\",\n model: \"HL Mountain Frame\",\n price: 1890.9,\n sellDate: \"2023-05-03\",\n sellTime: \"11:27\",\n inStock: false,\n },\n {\n brand: \"Camido\",\n model: \"Cycling Cap\",\n price: 130.1,\n sellDate: \"2023-03-27\",\n sellTime: \"03:17\",\n inStock: true,\n },\n {\n brand: \"Chatterpoint\",\n model: \"Road Tire Tube\",\n price: 59,\n sellDate: \"2023-08-28\",\n sellTime: \"08:01\",\n inStock: true,\n },\n {\n brand: \"Eidel\",\n model: \"HL Road Tire\",\n price: 279.99,\n sellDate: \"2023-10-02\",\n sellTime: \"13:23\",\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: \"Brand\",\n type: \"text\",\n data: \"brand\",\n },\n {\n title: \"Model\",\n type: \"text\",\n data: \"model\",\n },\n {\n title: \"Price\",\n type: \"numeric\",\n data: \"price\",\n locale: \"en-US\",\n numericFormat: {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n },\n },\n {\n title: \"Date\",\n type: \"intl-date\",\n data: \"sellDate\",\n locale: \"en-GB\",\n dateFormat: { day: \"2-digit\", month: \"2-digit\", year: \"numeric\" },\n className: \"htRight\",\n },\n {\n title: \"Time\",\n type: \"intl-time\",\n data: \"sellTime\",\n locale: \"en-GB\",\n timeFormat: { hour: \"2-digit\", minute: \"2-digit\", hour12: false },\n className: \"htRight\",\n },\n {\n title: \"In stock\",\n type: \"checkbox\",\n data: \"inStock\",\n className: \"htCenter\",\n },\n ],\n colHeaders: true,\n height: \"auto\",\n filters: true,\n className: \"exampleQuickFilter\",\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example6.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example6","exampleTitle":"External quick filter (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example7.ts.json index 807e39068..4abd7f7fb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Customize the filter button (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example7',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n .handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n }\n }\n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example7.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example7","exampleTitle":"Customize the filter button (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Customize the filter button (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example7',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n .handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n }\n }\n `,\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example7.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example7","exampleTitle":"Customize the filter button (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example8.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example8.ts.json index c9c1fcb50..010d20065 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example8.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example8.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Customize the filter button (4) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example8',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n /* hide the column menu button by default */\n .customFilterButtonExample2 .changeType {\n visibility: hidden;\n }\n\n /* show the column menu button on hover */\n .customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n }\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example8.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example8","exampleTitle":"Customize the filter button (4)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Customize the filter button (4) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example8',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n /* hide the column menu button by default */\n .customFilterButtonExample2 .changeType {\n visibility: hidden;\n }\n\n /* show the column menu button on hover */\n .customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n }\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example8.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example8","exampleTitle":"Customize the filter button (4)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example9.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example9.ts.json index 900ddde66..70c859011 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example9.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__angular__example9.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column filter · Exclude rows from filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example9',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example9.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example9","exampleTitle":"Exclude rows from filtering (2)","docPermalink":"/column-filter","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column filter · Exclude rows from filtering (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example9',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ];\n\n readonly hotSettings: GridSettings = {\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-filter/angular/example9.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"example9","exampleTitle":"Exclude rows from filtering (2)","docPermalink":"/column-filter","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.js.json index 41594cbb3..d99e97740 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleAvailableConditions');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleAvailableConditions.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleAvailableConditions');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleAvailableConditions.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.ts.json index 4bb5830f4..b5fd08b17 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleAvailableConditions.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleAvailableConditions')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleAvailableConditions.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleAvailableConditions')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n // offer only these conditions, in this order\n filters: {\n availableConditions: ['eq', 'neq', '---------', 'empty', 'not_empty'],\n },\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n // the default date conditions, minus the relative ones\n filters: {\n availableConditions: {\n exclude: ['intl_date_today', 'intl_date_tomorrow', 'intl_date_yesterday'],\n },\n },\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // remove \"Is not between\" from every numeric column\n filters: {\n availableConditions: {\n numeric: { exclude: ['not_between'] },\n },\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleAvailableConditions.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.js.json index 2a302d0cf..feaff6927 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Customize the filter button · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Customize the filter button · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.ts.json index 695165be0..0d405bdb3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Customize the filter button · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Customize the filter button · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample1',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.js.json index 4b94ab10f..38530e4ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Customize the filter button (3) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton2');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton2.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Customize the filter button (3) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton2');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton2.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.ts.json index 5b7113306..fde498a54 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleCustomFilterButton2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Customize the filter button (3) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton2')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton2.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Customize the filter button (3) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleCustomFilterButton2')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // to differentiate this example's CSS from other examples on this page\n className: 'customFilterButtonExample2',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleCustomFilterButton2.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.js.json index 426036fb1..4ecee222a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleDisableFilterForColumn');\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleDisableFilterForColumn.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleDisableFilterForColumn');\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleDisableFilterForColumn.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.ts.json index 3d018c199..a61775ae0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleDisableFilterForColumn.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleDisableFilterForColumn')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleDisableFilterForColumn.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleDisableFilterForColumn')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n // turn filtering off for this column only: its menu opens without the filter controls\n filters: false,\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for the whole grid\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleDisableFilterForColumn.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.js.json index 9924f6f00..67086565c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleEnableFilterInColumns');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast().to.col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast().to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast().to.col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col, TH) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleEnableFilterInColumns.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleEnableFilterInColumns');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast().to.col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast().to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast().to.col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col, TH) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleEnableFilterInColumns.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.ts.json index ac12d9bc4..15f275dbc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleEnableFilterInColumns.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleEnableFilterInColumns')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast()!.to.col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col, TH) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType')!;\n\n if (!button) {\n return;\n }\n\n button.parentElement!.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n} as Handsontable.GridSettings);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleEnableFilterInColumns.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleEnableFilterInColumns')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering for all columns\n filters: true,\n // enable the column menu for all columns\n // but display only the 'Filter by value' list and the 'OK' and 'Cancel' buttons\n dropdownMenu: {\n items: {\n filter_by_value: {\n // hide the 'Filter by value' list from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast()!.to.col < 1;\n },\n },\n },\n },\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader(col, TH) {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n if (col > 1) {\n const button = TH.querySelector('.changeType')!;\n\n if (!button) {\n return;\n }\n\n button.parentElement!.removeChild(button);\n }\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n} as Handsontable.GridSettings);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleEnableFilterInColumns.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.js.json index 503b5d42c..db4dcd32c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Exclude rows from filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleExcludeRowsFromFiltering');\nnew Handsontable(container, {\n data: [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleExcludeRowsFromFiltering.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Exclude rows from filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleExcludeRowsFromFiltering');\nnew Handsontable(container, {\n data: [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleExcludeRowsFromFiltering.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.ts.json index 54cdc9943..8b9123925 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleExcludeRowsFromFiltering.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Exclude rows from filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleExcludeRowsFromFiltering')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleExcludeRowsFromFiltering.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Exclude rows from filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleExcludeRowsFromFiltering')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'numeric',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n height: 200,\n colWidths: [120, 150, 120, 140, 120, 120],\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n colHeaders: true,\n // enable filtering, and leave the frozen rows out of it\n filters: {\n filterFixedRows: false,\n },\n // enable the column menu\n dropdownMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleExcludeRowsFromFiltering.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.js.json index 8ee40e90e..ee595299c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Filtering demo · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterBasicDemo');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterBasicDemo.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Filtering demo · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterBasicDemo');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterBasicDemo.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.ts.json index a6651b4fa..626ae9f0a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterBasicDemo.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Filtering demo · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterBasicDemo')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterBasicDemo.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Filtering demo · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterBasicDemo')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterBasicDemo.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.js.json index 807b411aa..d1c84df8a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter different types of data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterDifferentTypes');\n\nnew Handsontable(container, {\n data: [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ],\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterDifferentTypes.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter different types of data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterDifferentTypes');\n\nnew Handsontable(container, {\n data: [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ],\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterDifferentTypes.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.ts.json index 3cd8d7d9a..2c4ca6a99 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterDifferentTypes.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter different types of data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterDifferentTypes')!;\n\nnew Handsontable(container, {\n data: [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ],\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text', // 'text' is the default type, so you can omit this line\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterDifferentTypes.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter different types of data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterDifferentTypes')!;\n\nnew Handsontable(container, {\n data: [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n ],\n columns: [\n {\n title: 'Model',\n // set the type of the 'Model' column\n type: 'text', // 'text' is the default type, so you can omit this line\n data: 'model',\n },\n {\n title: 'Price',\n // set the type of the 'Price' column\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Sold on',\n // set the type of the 'Date' column\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n // set the type of the 'Time' column\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n // set the type of the 'In stock' column\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n {\n title: 'Size',\n // set the type of the 'Size' column\n type: 'dropdown',\n data: 'size',\n source: ['XS', 'S', 'M', 'L', 'XL'],\n className: 'htCenter',\n },\n {\n title: 'Color',\n // set the type of the 'Size' column\n type: 'autocomplete',\n data: 'color',\n source: ['White', 'Black', 'Yellow', 'Blue', 'Green'],\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 175,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterDifferentTypes.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.js.json index d43a91a14..0797f1eea 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Filtering with nested headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterNestedHeaders');\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ],\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterNestedHeaders.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Filtering with nested headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterNestedHeaders');\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ],\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterNestedHeaders.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.ts.json index 72ec0b711..e12080d62 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterNestedHeaders.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Filtering with nested headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterNestedHeaders')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ],\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterNestedHeaders.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Filtering with nested headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterNestedHeaders')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ],\n nestedHeaders: [\n [\n { label: 'Item', colspan: 2 },\n { label: 'Supply chain', colspan: 3 },\n ],\n ['SKU', 'Product name', 'Supplier', 'Category', 'Warehouse'],\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterNestedHeaders.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.js.json index e7d7ce297..dbe87b8e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter data on initialization · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterOnInitialization');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit() {\n const handsontableInstance = this;\n // get the `Filters` plugin, so you can use its API\n const filters = handsontableInstance.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterOnInitialization.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter data on initialization · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterOnInitialization');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit() {\n const handsontableInstance = this;\n // get the `Filters` plugin, so you can use its API\n const filters = handsontableInstance.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterOnInitialization.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.ts.json index 6f746ce8a..ad351d561 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterOnInitialization.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter data on initialization · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterOnInitialization')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit() {\n const handsontableInstance = this;\n // get the `Filters` plugin, so you can use its API\n const filters: Filters = handsontableInstance.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterOnInitialization.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter data on initialization · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterOnInitialization')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterInit()` is a Handsontable hook: it's fired after the Handsontable instance is initiated\n afterInit() {\n const handsontableInstance = this;\n // get the `Filters` plugin, so you can use its API\n const filters: Filters = handsontableInstance.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterOnInitialization.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.js.json index 07e44e64e..4c129efa9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter data programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterThroughAPI1');\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters = hot.getPlugin('filters');\n\ndocument.querySelector('.filterBelow200').addEventListener('click', () => {\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n});\ndocument.querySelector('.filterAbove200').addEventListener('click', () => {\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\ndocument.querySelector('.clearAllFilters').addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterThroughAPI1.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Filter data programmatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterThroughAPI1');\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters = hot.getPlugin('filters');\n\ndocument.querySelector('.filterBelow200').addEventListener('click', () => {\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n});\ndocument.querySelector('.filterAbove200').addEventListener('click', () => {\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\ndocument.querySelector('.clearAllFilters').addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterThroughAPI1.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.ts.json index 1dd3f4936..7c7e948da 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterThroughAPI1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter data programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterThroughAPI1')!;\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters: Filters = hot.getPlugin('filters');\n\ndocument.querySelector('.filterBelow200')!.addEventListener('click', () => {\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.filterAbove200')!.addEventListener('click', () => {\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.clearAllFilters')!.addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterThroughAPI1.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Filter data programmatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleFilterThroughAPI1')!;\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters: Filters = hot.getPlugin('filters');\n\ndocument.querySelector('.filterBelow200')!.addEventListener('click', () => {\n // clear any existing filters\n filters.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters.addCondition(2, 'lt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.filterAbove200')!.addEventListener('click', () => {\n filters.clearConditions();\n // display only items that are more than ('gt') $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.clearAllFilters')!.addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterThroughAPI1.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.js.json index 033f55123..5b84e5bdf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order) => (a, b) => {\n const rank = (value) => (order.indexOf(value) === -1 ? order.length : order.indexOf(value));\n\n return rank(a) - rank(b);\n};\n\nconst container = document.querySelector('#exampleFilterValueOrder');\n\nnew Handsontable(container, {\n data: [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ],\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterValueOrder.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order) => (a, b) => {\n const rank = (value) => (order.indexOf(value) === -1 ? order.length : order.indexOf(value));\n\n return rank(a) - rank(b);\n};\n\nconst container = document.querySelector('#exampleFilterValueOrder');\n\nnew Handsontable(container, {\n data: [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ],\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterValueOrder.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.ts.json index 434152c31..aef0803ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleFilterValueOrder.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\nconst container = document.querySelector('#exampleFilterValueOrder')!;\n\nnew Handsontable(container, {\n data: [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ],\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterValueOrder.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\nconst container = document.querySelector('#exampleFilterValueOrder')!;\n\nnew Handsontable(container, {\n data: [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n ],\n columns: [\n { title: 'Task', data: 'task', type: 'text' },\n {\n title: 'Priority',\n data: 'priority',\n type: 'text',\n // order this column's filter list by severity rather than alphabetically\n filterValueComparator: orderBy(priorityOrder),\n },\n {\n title: 'Size',\n data: 'size',\n type: 'text',\n filterValueComparator: orderBy(sizeOrder),\n },\n ],\n filters: true,\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleFilterValueOrder.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.js.json index 117b1f2f3..6ce86971a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Get filtered data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleGetFilteredData');\nconst rowCountInfo = document.querySelector('#rowCountInfo');\nfunction updateRowCountInfo(instance) {\n // `getData()` returns only the rows that pass the current filters\n const visibleRowCount = instance.getData().length;\n // `getSourceData()` always returns every row, filtered or not\n const totalRowCount = instance.getSourceData().length;\n rowCountInfo.textContent = `Showing ${visibleRowCount} of ${totalRowCount} rows.`;\n}\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterFilter()` fires after Handsontable applies the filters\n afterFilter() {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nupdateRowCountInfo(hot);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleGetFilteredData.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Get filtered data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleGetFilteredData');\nconst rowCountInfo = document.querySelector('#rowCountInfo');\nfunction updateRowCountInfo(instance) {\n // `getData()` returns only the rows that pass the current filters\n const visibleRowCount = instance.getData().length;\n // `getSourceData()` always returns every row, filtered or not\n const totalRowCount = instance.getSourceData().length;\n rowCountInfo.textContent = `Showing ${visibleRowCount} of ${totalRowCount} rows.`;\n}\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterFilter()` fires after Handsontable applies the filters\n afterFilter() {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nupdateRowCountInfo(hot);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleGetFilteredData.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.ts.json index 6d28a7dd7..d5c50b43d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleGetFilteredData.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Get filtered data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleGetFilteredData')!;\nconst rowCountInfo = document.querySelector('#rowCountInfo')!;\n\nfunction updateRowCountInfo(instance: Handsontable) {\n // `getData()` returns only the rows that pass the current filters\n const visibleRowCount = instance.getData().length;\n // `getSourceData()` always returns every row, filtered or not\n const totalRowCount = instance.getSourceData().length;\n\n rowCountInfo.textContent = `Showing ${visibleRowCount} of ${totalRowCount} rows.`;\n}\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterFilter()` fires after Handsontable applies the filters\n afterFilter() {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nupdateRowCountInfo(hot);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleGetFilteredData.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Get filtered data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleGetFilteredData')!;\nconst rowCountInfo = document.querySelector('#rowCountInfo')!;\n\nfunction updateRowCountInfo(instance: Handsontable) {\n // `getData()` returns only the rows that pass the current filters\n const visibleRowCount = instance.getData().length;\n // `getSourceData()` always returns every row, filtered or not\n const totalRowCount = instance.getSourceData().length;\n\n rowCountInfo.textContent = `Showing ${visibleRowCount} of ${totalRowCount} rows.`;\n}\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n // `afterFilter()` fires after Handsontable applies the filters\n afterFilter() {\n updateRowCountInfo(this);\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nupdateRowCountInfo(hot);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleGetFilteredData.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.js.json index aa8aab0ce..7e324a0ef 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · External quick filter · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleQuickFilter');\nconst filterField = document.querySelector('#filterField');\n\n// Custom dropdown logic\nconst trigger = document.getElementById('filterTrigger');\nconst menu = document.getElementById('filterMenu');\nconst label = document.getElementById('filterTriggerLabel');\nlet selectedColumn = '0';\n\ntrigger.addEventListener('click', () => {\n const open = trigger.getAttribute('aria-expanded') === 'true';\n\n trigger.setAttribute('aria-expanded', String(!open));\n menu.hidden = open;\n});\n\nmenu.addEventListener('click', (e) => {\n const li = e.target.closest('li[data-value]');\n\n if (!li) return;\n\n menu.querySelectorAll('li').forEach((el) => el.removeAttribute('aria-selected'));\n li.setAttribute('aria-selected', 'true');\n selectedColumn = li.dataset.value;\n label.textContent = li.textContent.trim();\n trigger.setAttribute('aria-expanded', 'false');\n menu.hidden = true;\n});\n\ndocument.addEventListener('click', (e) => {\n if (!e.target.closest('#filterDropdown')) {\n trigger.setAttribute('aria-expanded', 'false');\n menu.hidden = true;\n }\n});\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n colHeaders: true,\n height: 'auto',\n filters: true,\n className: 'exampleQuickFilter',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// add a filter input listener\nfilterField.addEventListener('keyup', (event) => {\n const filters = hot.getPlugin('filters');\n\n filters.removeConditions(selectedColumn);\n filters.addCondition(selectedColumn, 'contains', [event.target.value]);\n filters.filter();\n hot.render();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleQuickFilter.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · External quick filter · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleQuickFilter');\nconst filterField = document.querySelector('#filterField');\n\n// Custom dropdown logic\nconst trigger = document.getElementById('filterTrigger');\nconst menu = document.getElementById('filterMenu');\nconst label = document.getElementById('filterTriggerLabel');\nlet selectedColumn = '0';\n\ntrigger.addEventListener('click', () => {\n const open = trigger.getAttribute('aria-expanded') === 'true';\n\n trigger.setAttribute('aria-expanded', String(!open));\n menu.hidden = open;\n});\n\nmenu.addEventListener('click', (e) => {\n const li = e.target.closest('li[data-value]');\n\n if (!li) return;\n\n menu.querySelectorAll('li').forEach((el) => el.removeAttribute('aria-selected'));\n li.setAttribute('aria-selected', 'true');\n selectedColumn = li.dataset.value;\n label.textContent = li.textContent.trim();\n trigger.setAttribute('aria-expanded', 'false');\n menu.hidden = true;\n});\n\ndocument.addEventListener('click', (e) => {\n if (!e.target.closest('#filterDropdown')) {\n trigger.setAttribute('aria-expanded', 'false');\n menu.hidden = true;\n }\n});\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n colHeaders: true,\n height: 'auto',\n filters: true,\n className: 'exampleQuickFilter',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// add a filter input listener\nfilterField.addEventListener('keyup', (event) => {\n const filters = hot.getPlugin('filters');\n\n filters.removeConditions(selectedColumn);\n filters.addCondition(selectedColumn, 'contains', [event.target.value]);\n filters.filter();\n hot.render();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleQuickFilter.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.ts.json index a0931ebfb..2ed69d04a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleQuickFilter.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · External quick filter · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleQuickFilter')!;\nconst filterField = document.querySelector('#filterField')!;\n\n// Custom dropdown logic\nconst trigger = document.getElementById('filterTrigger')!;\nconst menu = document.getElementById('filterMenu')!;\nconst label = document.getElementById('filterTriggerLabel')!;\nlet selectedColumn: string = '0';\n\ntrigger.addEventListener('click', () => {\n const open = trigger.getAttribute('aria-expanded') === 'true';\n\n trigger.setAttribute('aria-expanded', String(!open));\n (menu as HTMLElement).hidden = open;\n});\n\nmenu.addEventListener('click', (e: Event) => {\n const li = (e.target as HTMLElement).closest('li[data-value]') as HTMLElement | null;\n\n if (!li) return;\n\n menu.querySelectorAll('li').forEach((el) => el.removeAttribute('aria-selected'));\n li.setAttribute('aria-selected', 'true');\n selectedColumn = li.dataset.value!;\n label.textContent = li.textContent!.trim();\n trigger.setAttribute('aria-expanded', 'false');\n (menu as HTMLElement).hidden = true;\n});\n\ndocument.addEventListener('click', (e: Event) => {\n if (!(e.target as HTMLElement).closest('#filterDropdown')) {\n trigger.setAttribute('aria-expanded', 'false');\n (menu as HTMLElement).hidden = true;\n }\n});\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n colHeaders: true,\n height: 'auto',\n filters: true,\n className: 'exampleQuickFilter',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// add a filter input listener\nfilterField.addEventListener('keyup', (event) => {\n const filters: Filters = hot.getPlugin('filters');\n\n filters.removeConditions(selectedColumn as unknown as number);\n filters.addCondition(selectedColumn as unknown as number, 'contains', [(event.target as HTMLInputElement).value]);\n filters.filter();\n hot.render();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleQuickFilter.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · External quick filter · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n \n \n \n
\n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleQuickFilter')!;\nconst filterField = document.querySelector('#filterField')!;\n\n// Custom dropdown logic\nconst trigger = document.getElementById('filterTrigger')!;\nconst menu = document.getElementById('filterMenu')!;\nconst label = document.getElementById('filterTriggerLabel')!;\nlet selectedColumn: string = '0';\n\ntrigger.addEventListener('click', () => {\n const open = trigger.getAttribute('aria-expanded') === 'true';\n\n trigger.setAttribute('aria-expanded', String(!open));\n (menu as HTMLElement).hidden = open;\n});\n\nmenu.addEventListener('click', (e: Event) => {\n const li = (e.target as HTMLElement).closest('li[data-value]') as HTMLElement | null;\n\n if (!li) return;\n\n menu.querySelectorAll('li').forEach((el) => el.removeAttribute('aria-selected'));\n li.setAttribute('aria-selected', 'true');\n selectedColumn = li.dataset.value!;\n label.textContent = li.textContent!.trim();\n trigger.setAttribute('aria-expanded', 'false');\n (menu as HTMLElement).hidden = true;\n});\n\ndocument.addEventListener('click', (e: Event) => {\n if (!(e.target as HTMLElement).closest('#filterDropdown')) {\n trigger.setAttribute('aria-expanded', 'false');\n (menu as HTMLElement).hidden = true;\n }\n});\n\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n colHeaders: true,\n height: 'auto',\n filters: true,\n className: 'exampleQuickFilter',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// add a filter input listener\nfilterField.addEventListener('keyup', (event) => {\n const filters: Filters = hot.getPlugin('filters');\n\n filters.removeConditions(selectedColumn as unknown as number);\n filters.addCondition(selectedColumn as unknown as number, 'contains', [(event.target as HTMLInputElement).value]);\n filters.filter();\n hot.render();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/javascript/exampleQuickFilter.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.js.json index b3657a122..ec7811719 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Save and restore filter settings · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleSaveRestoreFilters');\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// get the `Filters` plugin, so you can use its API\nconst filters = hot.getPlugin('filters');\nlet savedConditions = [];\ndocument.querySelector('.applySampleFilter').addEventListener('click', () => {\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\ndocument.querySelector('.saveFilters').addEventListener('click', () => {\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions = filters.exportConditions();\n});\ndocument.querySelector('.clearFilters').addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});\ndocument.querySelector('.restoreFilters').addEventListener('click', () => {\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(savedConditions);\n filters.filter();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSaveRestoreFilters.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Save and restore filter settings · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#exampleSaveRestoreFilters');\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// get the `Filters` plugin, so you can use its API\nconst filters = hot.getPlugin('filters');\nlet savedConditions = [];\ndocument.querySelector('.applySampleFilter').addEventListener('click', () => {\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\ndocument.querySelector('.saveFilters').addEventListener('click', () => {\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions = filters.exportConditions();\n});\ndocument.querySelector('.clearFilters').addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});\ndocument.querySelector('.restoreFilters').addEventListener('click', () => {\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(savedConditions);\n filters.filter();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSaveRestoreFilters.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.ts.json index 58d9e0880..8e794bc82 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSaveRestoreFilters.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Save and restore filter settings · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSaveRestoreFilters')!;\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters: Filters = hot.getPlugin('filters');\nlet savedConditions: ColumnConditions[] = [];\n\ndocument.querySelector('.applySampleFilter')!.addEventListener('click', () => {\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.saveFilters')!.addEventListener('click', () => {\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions = filters.exportConditions();\n});\n\ndocument.querySelector('.clearFilters')!.addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});\n\ndocument.querySelector('.restoreFilters')!.addEventListener('click', () => {\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(savedConditions);\n filters.filter();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSaveRestoreFilters.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Save and restore filter settings · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Filters } from 'handsontable/plugins';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSaveRestoreFilters')!;\nconst hot = new Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `Filters` plugin, so you can use its API\nconst filters: Filters = hot.getPlugin('filters');\nlet savedConditions: ColumnConditions[] = [];\n\ndocument.querySelector('.applySampleFilter')!.addEventListener('click', () => {\n filters.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters.addCondition(2, 'gt', [200]);\n filters.filter();\n});\n\ndocument.querySelector('.saveFilters')!.addEventListener('click', () => {\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions = filters.exportConditions();\n});\n\ndocument.querySelector('.clearFilters')!.addEventListener('click', () => {\n filters.clearConditions();\n filters.filter();\n});\n\ndocument.querySelector('.restoreFilters')!.addEventListener('click', () => {\n // `importConditions()` expects the same physical-column-indexed structure\n filters.importConditions(savedConditions);\n filters.filter();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSaveRestoreFilters.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.js.json index 92a7f11af..3e41cf03a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSearchMode');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply',\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSearchMode.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSearchMode');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply',\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSearchMode.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.ts.json index b351218b0..cb022c3bd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleSearchMode.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSearchMode')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply',\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSearchMode.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleSearchMode')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering with option\n filters: {\n searchMode: 'apply',\n },\n dropdownMenu: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleSearchMode.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.js.json index 61a6c67d4..7832c7e1b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Server-side filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleServerSideFilter');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(`The amount of filters added to this column: ${lastChanged.conditions.length}`);\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleServerSideFilter.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Server-side filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleServerSideFilter');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(`The amount of filters added to this column: ${lastChanged.conditions.length}`);\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleServerSideFilter.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.ts.json index 4e89a1ffe..efccbc192 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleServerSideFilter.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Server-side filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleServerSideFilter')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(`The amount of filters added to this column: ${lastChanged.conditions.length}`);\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleServerSideFilter.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Server-side filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleServerSideFilter')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu\n dropdownMenu: true,\n height: 'auto',\n // `beforeFilter()` is a Handsontable hook\n // it's fired after Handsontable gathers information about the filters, but before the filters are applied\n beforeFilter(conditionsStack) {\n // gather information about the filters\n console.log(`The amount of filters: ${conditionsStack.length}`);\n\n // when the filters are cleared, the conditions stack is empty\n const [lastChanged] = conditionsStack;\n\n if (lastChanged) {\n console.log(`The last changed column index: ${lastChanged.column}`);\n console.log(`The amount of filters added to this column: ${lastChanged.conditions.length}`);\n // the list of filter conditions\n console.log(lastChanged.conditions);\n }\n\n // return `false` to disable filtering on the client side\n return false;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleServerSideFilter.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.js.json index c63c26b85..75f031179 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleShowFilterItemsOnly');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleShowFilterItemsOnly.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column filter · Enable filtering · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleShowFilterItemsOnly');\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-filter/javascript/exampleShowFilterItemsOnly.js","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.ts.json index 897a72423..5599c336c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__javascript__exampleShowFilterItemsOnly.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleShowFilterItemsOnly')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleShowFilterItemsOnly.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column filter · Enable filtering · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#exampleShowFilterItemsOnly')!;\n\nnew Handsontable(container, {\n data: [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n ],\n columns: [\n {\n title: 'Brand',\n type: 'text',\n data: 'brand',\n },\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n },\n ],\n // enable filtering\n filters: true,\n // enable the column menu, but display only the filter menu items\n dropdownMenu: ['filter_by_condition', 'filter_by_value', 'filter_action_bar'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-filter/javascript/exampleShowFilterItemsOnly.ts","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleAvailableConditions.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleAvailableConditions.tsx.json index e61427ce4..fa77b4937 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleAvailableConditions.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleAvailableConditions.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleAvailableConditions\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleAvailableConditions.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleAvailableConditions\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleAvailableConditions.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton.tsx.json index 42522f944..1771c94d5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Customize the filter button · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleCustomFilterButton\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/react/exampleCustomFilterButton.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Customize the filter button · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleCustomFilterButton\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".handsontable.customFilterButtonExample1 .changeType {\n --ht-icon-button-background-color: #e2e2e263;\n --ht-icon-button-border-radius: 100%;\n --ht-icon-menu: url(\"data:image/svg+xml,%3Csvg width=%2716%27 height=%2716%27 viewBox=%270 0 16 16%27 fill=%27none%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cpath d=%27M6.83337 7.99984C6.83337 8.30926 6.95629 8.606 7.17508 8.8248C7.39388 9.04359 7.69062 9.1665 8.00004 9.1665C8.30946 9.1665 8.60621 9.04359 8.825 8.8248C9.04379 8.606 9.16671 8.30926 9.16671 7.99984C9.16671 7.69042 9.04379 7.39367 8.825 7.17488C8.60621 6.95609 8.30946 6.83317 8.00004 6.83317C7.69062 6.83317 7.39388 6.95609 7.17508 7.17488C6.95629 7.39367 6.83337 7.69042 6.83337 7.99984Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 12.4165C6.83337 12.7259 6.95629 13.0227 7.17508 13.2415C7.39388 13.4603 7.69062 13.5832 8.00004 13.5832C8.30946 13.5832 8.60621 13.4603 8.825 13.2415C9.04379 13.0227 9.16671 12.7259 9.16671 12.4165C9.16671 12.1071 9.04379 11.8103 8.825 11.5915C8.60621 11.3728 8.30946 11.2498 8.00004 11.2498C7.69062 11.2498 7.39388 11.3728 7.17508 11.5915C6.95629 11.8103 6.83337 12.1071 6.83337 12.4165Z%27 fill=%27%23222222%27/%3E%3Cpath d=%27M6.83337 3.58317C6.83337 3.89259 6.95629 4.18934 7.17508 4.40813C7.39388 4.62692 7.69062 4.74984 8.00004 4.74984C8.30946 4.74984 8.60621 4.62692 8.825 4.40813C9.04379 4.18934 9.16671 3.89259 9.16671 3.58317C9.16671 3.27375 9.04379 2.97701 8.825 2.75821C8.60621 2.53942 8.30946 2.4165 8.00004 2.4165C7.69062 2.4165 7.39388 2.53942 7.17508 2.75821C6.95629 2.97701 6.83337 3.27375 6.83337 3.58317Z%27 fill=%27currentColor%27/%3E%3C/svg%3E\");\n}"},"docsPath":"guides/columns/column-filter/react/exampleCustomFilterButton.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton2.tsx.json index b9050abd5..4fc2fedf4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleCustomFilterButton2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Customize the filter button (3) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleCustomFilterButton2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/react/exampleCustomFilterButton2.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Customize the filter button (3) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleCustomFilterButton2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"/* hide the column menu button by default */\n.customFilterButtonExample2 .changeType {\n visibility: hidden;\n}\n\n/* show the column menu button on hover */\n.customFilterButtonExample2 th .relative:hover .changeType {\n visibility: visible;\n}"},"docsPath":"guides/columns/column-filter/react/exampleCustomFilterButton2.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleDisableFilterForColumn.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleDisableFilterForColumn.tsx.json index 245dc021b..3887816af 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleDisableFilterForColumn.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleDisableFilterForColumn.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleDisableFilterForColumn\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleDisableFilterForColumn.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleDisableFilterForColumn\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleDisableFilterForColumn.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleEnableFilterInColumns.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleEnableFilterInColumns.tsx.json index 5dd2f1fd4..52819dd75 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleEnableFilterInColumns.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleEnableFilterInColumns.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleEnableFilterInColumns\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n const removeColumnMenuButton = (col: number, TH: { querySelector: (value: string) => any }) => {\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement.removeChild(button);\n }\n };\n\n return (\n 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast()!.to.col < 1;\n },\n },\n },\n }}\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader={removeColumnMenuButton}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleEnableFilterInColumns.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleEnableFilterInColumns\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n // remove the column menu button from the 'Brand', 'Price', and 'Date' columns\n const removeColumnMenuButton = (col: number, TH: { querySelector: (value: string) => any }) => {\n if (col > 1) {\n const button = TH.querySelector('.changeType');\n\n if (!button) {\n return;\n }\n\n button.parentElement.removeChild(button);\n }\n };\n\n return (\n 0;\n },\n },\n filter_action_bar: {\n // hide the 'OK' and 'Cancel' buttons from all columns but the first one\n hidden() {\n return this.getSelectedRangeLast()!.to.col > 0;\n },\n },\n clear_column: {\n // hide the 'Clear column' menu item from the first column\n hidden() {\n return this.getSelectedRangeLast()!.to.col < 1;\n },\n },\n },\n }}\n // `afterGetColHeader()` is a Handsontable hook\n // it's fired after Handsontable appends information about a column header to the table header\n afterGetColHeader={removeColumnMenuButton}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleEnableFilterInColumns.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleExcludeRowsFromFiltering.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleExcludeRowsFromFiltering.tsx.json index 2259a1338..ccc3f3dfc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleExcludeRowsFromFiltering.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleExcludeRowsFromFiltering.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Exclude rows from filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleExcludeRowsFromFiltering\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleExcludeRowsFromFiltering.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Exclude rows from filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleExcludeRowsFromFiltering\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 11,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 0,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 1,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 3,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 5,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 22,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 13,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '13:23',\n inStock: 14,\n },\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 16,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: 18,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: 3,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: 0,\n },\n {\n brand: 'Vinte',\n model: 'ML Road Frame-W',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: 2,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleExcludeRowsFromFiltering.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterBasicDemo.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterBasicDemo.tsx.json index d50d90dea..e9c0419f2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterBasicDemo.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterBasicDemo.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Filtering demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterBasicDemo\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterBasicDemo.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Filtering demo · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterBasicDemo\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterBasicDemo.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterDifferentTypes.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterDifferentTypes.tsx.json index f2dc6b308..07c0d0868 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterDifferentTypes.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterDifferentTypes.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Filter different types of data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterDifferentTypes\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterDifferentTypes.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Filter different types of data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterDifferentTypes\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n model: 'Racing Socks',\n size: 'S',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n color: 'Black',\n },\n {\n model: 'HL Mountain Shirt',\n size: 'XS',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n color: 'White',\n },\n {\n model: 'Cycling Cap',\n size: 'L',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n color: 'Green',\n },\n {\n model: 'Ski Jacket',\n size: 'M',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n color: 'Blue',\n },\n {\n model: 'HL Goggles',\n size: 'XL',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n color: 'Black',\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterDifferentTypes.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterNestedHeaders.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterNestedHeaders.tsx.json index bcb4e0d21..b9d6a8109 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterNestedHeaders.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterNestedHeaders.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Filtering with nested headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterNestedHeaders\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterNestedHeaders.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Filtering with nested headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterNestedHeaders\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// to import filtering as an individual module, see the 'Import the filtering module' section of this page\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterNestedHeaders.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterOnInitialization.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterOnInitialization.tsx.json index adb93a522..f429121df 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterOnInitialization.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterOnInitialization.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Filter data on initialization · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterOnInitialization\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// you need `useRef` to call Handsontable's instance methods\nimport { useRef, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n\n useEffect(() => {\n const handsontableInstance = hotTableComponentRef.current?.hotInstance;\n // get the `Filters` plugin, so you can use its API\n const filters = handsontableInstance?.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters?.addCondition(2, 'lt', [200]);\n filters?.filter();\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterOnInitialization.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Filter data on initialization · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterOnInitialization\"));\nroot.render(React.createElement(App));","/src/App.tsx":"// you need `useRef` to call Handsontable's instance methods\nimport { useRef, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n\n useEffect(() => {\n const handsontableInstance = hotTableComponentRef.current?.hotInstance;\n // get the `Filters` plugin, so you can use its API\n const filters = handsontableInstance?.getPlugin('filters');\n\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters?.addCondition(2, 'lt', [200]);\n filters?.filter();\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterOnInitialization.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterThroughAPI1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterThroughAPI1.tsx.json index dd00445ba..89e1f79e5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterThroughAPI1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterThroughAPI1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Filter data programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterThroughAPI1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const filterBelow200 = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // clear any existing filters\n filters?.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters?.addCondition(2, 'lt', [200]);\n filters?.filter();\n };\n\n const filterAbove200 = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n // display only items that are more than ('gt') $200\n filters?.addCondition(2, 'gt', [200]);\n filters?.filter();\n };\n\n const clearAllFilters = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // clear all filters\n filters?.clearConditions();\n filters?.filter();\n };\n\n return (\n <>\n
\n
\n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterThroughAPI1.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Filter data programmatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterThroughAPI1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const filterBelow200 = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // clear any existing filters\n filters?.clearConditions();\n // filter data by the 'Price' column (column at index 2)\n // to display only items that are less than ('lt') $200\n filters?.addCondition(2, 'lt', [200]);\n filters?.filter();\n };\n\n const filterAbove200 = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n // display only items that are more than ('gt') $200\n filters?.addCondition(2, 'gt', [200]);\n filters?.filter();\n };\n\n const clearAllFilters = () => {\n // get the `Filters` plugin, so you can use its API\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // clear all filters\n filters?.clearConditions();\n filters?.filter();\n };\n\n return (\n <>\n
\n
\n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterThroughAPI1.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterValueOrder.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterValueOrder.tsx.json index 5a592ede6..db80936f7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterValueOrder.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleFilterValueOrder.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterValueOrder\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\nconst data = [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterValueOrder.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleFilterValueOrder\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// the order you want in the \"Filter by value\" list, most severe first\nconst priorityOrder = ['Critical', 'High', 'Medium', 'Low'];\nconst sizeOrder = ['XS', 'S', 'M', 'L', 'XL'];\n\n// turns an ordered list into a comparator; values the list does not know go last\nconst orderBy = (order: string[]) => (a: unknown, b: unknown): number => {\n const rank = (value: unknown) =>\n order.indexOf(value as string) === -1 ? order.length : order.indexOf(value as string);\n\n return rank(a) - rank(b);\n};\n\nconst data = [\n { task: 'Fix login timeout', priority: 'High', size: 'M' },\n { task: 'Update privacy page', priority: 'Low', size: 'XS' },\n { task: 'Database failover', priority: 'Critical', size: 'XL' },\n { task: 'Refresh icons', priority: 'Medium', size: 'S' },\n { task: 'Rotate API keys', priority: 'High', size: 'L' },\n { task: 'Archive old reports', priority: '', size: 'S' },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleFilterValueOrder.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleGetFilteredData.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleGetFilteredData.tsx.json index 9a60be40e..3caa99ad1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleGetFilteredData.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleGetFilteredData.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Get filtered data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleGetFilteredData\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const [rowCountInfo, setRowCountInfo] = useState('');\n\n const updateRowCountInfo = () => {\n const hotInstance = hotTableComponentRef.current?.hotInstance;\n\n if (!hotInstance) {\n return;\n }\n\n // `getData()` returns only the rows that pass the current filters\n // `getSourceData()` always returns every row, filtered or not\n setRowCountInfo(`Showing ${hotInstance.getData().length} of ${hotInstance.getSourceData().length} rows.`);\n };\n\n return (\n <>\n

{rowCountInfo}

\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleGetFilteredData.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Get filtered data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleGetFilteredData\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const [rowCountInfo, setRowCountInfo] = useState('');\n\n const updateRowCountInfo = () => {\n const hotInstance = hotTableComponentRef.current?.hotInstance;\n\n if (!hotInstance) {\n return;\n }\n\n // `getData()` returns only the rows that pass the current filters\n // `getSourceData()` always returns every row, filtered or not\n setRowCountInfo(`Showing ${hotInstance.getData().length} of ${hotInstance.getSourceData().length} rows.`);\n };\n\n return (\n <>\n

{rowCountInfo}

\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleGetFilteredData.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleQuickFilter.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleQuickFilter.tsx.json index 3f4121f51..2a9220819 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleQuickFilter.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleQuickFilter.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · External quick filter · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleQuickFilter\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Embedded so the example is self-contained in bundler environments.\nconst QUICK_FILTER_STYLES = `\n .controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n #filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n }\n #filterField::placeholder { color: var(--sl-color-gray-3, #777777); }\n #filterField:focus { border-color: var(--sl-color-accent, #1A42E8); }\n #filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n .filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n .filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n }\n .filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n }\n .filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n }\n .filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n }\n .filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron { transform: rotate(180deg); }\n .filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n }\n .filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n }\n .filter-dropdown-menu li:last-child { border-bottom: none; }\n .filter-dropdown-menu li:hover,\n .filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n }\n .filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n`;\n\nconst columnOptions = [\n { value: '0', label: 'Brand' },\n { value: '1', label: 'Model' },\n { value: '2', label: 'Price' },\n { value: '3', label: 'Date' },\n { value: '4', label: 'Time' },\n { value: '5', label: 'In stock' },\n];\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const dropdownRef = useRef(null);\n const [selectedColumn, setSelectedColumn] = useState('0');\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener('click', handleClickOutside);\n\n return () => document.removeEventListener('click', handleClickOutside);\n }, []);\n\n const handleFilter = (event: React.KeyboardEvent) => {\n const handsontableInstance = hotTableComponentRef.current?.hotInstance;\n const filtersPlugin = handsontableInstance?.getPlugin('filters');\n\n filtersPlugin?.removeConditions(Number(selectedColumn));\n filtersPlugin?.addCondition(Number(selectedColumn), 'contains', [(event.target as HTMLInputElement).value]);\n filtersPlugin?.filter();\n handsontableInstance?.render();\n };\n\n const handleSelect = (col: { value: string; label: string }) => {\n setSelectedColumn(col.value);\n setOpen(false);\n };\n\n const selectedLabel = columnOptions.find((c) => c.value === selectedColumn)?.label || 'Brand';\n\n return (\n <>\n \n
\n
\n
\n Select a column:\n setOpen(!open)}\n >\n {selectedLabel}\n \n \n {open && (\n
    \n {columnOptions.map((col) => (\n handleSelect(col)}\n >\n {col.label}\n \n ))}\n
\n )}\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/react/exampleQuickFilter.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · External quick filter · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleQuickFilter\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Embedded so the example is self-contained in bundler environments.\nconst QUICK_FILTER_STYLES = `\n .controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n }\n #filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n }\n #filterField::placeholder { color: var(--sl-color-gray-3, #777777); }\n #filterField:focus { border-color: var(--sl-color-accent, #1A42E8); }\n #filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n .filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n }\n .filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n }\n .filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n }\n .filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n }\n .filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n }\n .filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron { transform: rotate(180deg); }\n .filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n }\n .filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n }\n .filter-dropdown-menu li:last-child { border-bottom: none; }\n .filter-dropdown-menu li:hover,\n .filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n }\n .filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n }\n`;\n\nconst columnOptions = [\n { value: '0', label: 'Brand' },\n { value: '1', label: 'Model' },\n { value: '2', label: 'Price' },\n { value: '3', label: 'Date' },\n { value: '4', label: 'Time' },\n { value: '5', label: 'In stock' },\n];\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const dropdownRef = useRef(null);\n const [selectedColumn, setSelectedColumn] = useState('0');\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener('click', handleClickOutside);\n\n return () => document.removeEventListener('click', handleClickOutside);\n }, []);\n\n const handleFilter = (event: React.KeyboardEvent) => {\n const handsontableInstance = hotTableComponentRef.current?.hotInstance;\n const filtersPlugin = handsontableInstance?.getPlugin('filters');\n\n filtersPlugin?.removeConditions(Number(selectedColumn));\n filtersPlugin?.addCondition(Number(selectedColumn), 'contains', [(event.target as HTMLInputElement).value]);\n filtersPlugin?.filter();\n handsontableInstance?.render();\n };\n\n const handleSelect = (col: { value: string; label: string }) => {\n setSelectedColumn(col.value);\n setOpen(false);\n };\n\n const selectedLabel = columnOptions.find((c) => c.value === selectedColumn)?.label || 'Brand';\n\n return (\n <>\n \n
\n
\n
\n Select a column:\n setOpen(!open)}\n >\n {selectedLabel}\n \n \n {open && (\n
    \n {columnOptions.map((col) => (\n handleSelect(col)}\n >\n {col.label}\n \n ))}\n
\n )}\n
\n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controlsQuickFilter {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n margin: 0;\n padding: 0;\n}\n\n#filterField {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: none;\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.4rem 0.625rem;\n outline: none;\n width: 140px;\n}\n\n#filterField::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n#filterField:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n#filterField:focus-visible {\n border-color: var(--sl-color-accent, #1A42E8);\n box-shadow: 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}\n\n/* Filter dropdown */\n.filter-dropdown {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.filter-dropdown-label {\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-sm, 0.875rem);\n white-space: nowrap;\n}\n\n.filter-dropdown-trigger {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n cursor: pointer;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 500;\n padding: 0.4rem 0.625rem;\n transition: color 0.15s, background-color 0.15s;\n white-space: nowrap;\n border-radius: 0;\n}\n\n.filter-dropdown-trigger:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-7, var(--sl-color-gray-6, #eeeeee));\n}\n\n.filter-dropdown-chevron {\n flex-shrink: 0;\n margin-inline-start: 0.15rem;\n transition: transform 0.15s;\n}\n\n.filter-dropdown-trigger[aria-expanded='true'] .filter-dropdown-chevron {\n transform: rotate(180deg);\n}\n\n.filter-dropdown-menu {\n background: var(--sl-color-bg-nav, #ffffff);\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n box-shadow: none;\n inset-inline-start: 0;\n list-style: none;\n margin: 0;\n min-width: 100%;\n overflow-y: auto;\n padding: 0;\n position: absolute;\n top: 100%;\n z-index: 9999;\n}\n\n.filter-dropdown-menu[hidden] {\n display: none !important;\n}\n\n.filter-dropdown-menu li {\n align-items: center;\n color: var(--sl-color-text, #333333);\n display: flex;\n font-size: var(--sl-text-sm, 0.875rem);\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n transition: background 0.1s, color 0.1s;\n white-space: nowrap;\n list-style: none;\n margin: 0;\n}\n\n.filter-dropdown-menu li:last-child {\n border-bottom: none;\n}\n\n.filter-dropdown-menu li:hover,\n.filter-dropdown-menu li:focus-visible {\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-white, #333333);\n outline: none;\n}\n\n.filter-dropdown-menu li[aria-selected='true'] {\n color: var(--sl-color-white, #333333);\n box-shadow: inset 0 0 0 1px var(--sl-color-accent, #1A42E8);\n}"},"docsPath":"guides/columns/column-filter/react/exampleQuickFilter.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSaveRestoreFilters.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSaveRestoreFilters.tsx.json index e5080ae99..dadcf07e6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSaveRestoreFilters.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSaveRestoreFilters.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Save and restore filter settings · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleSaveRestoreFilters\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const savedConditions = useRef([]);\n\n const applySampleFilter = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters?.addCondition(2, 'gt', [200]);\n filters?.filter();\n };\n\n const saveFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions.current = filters?.exportConditions() ?? [];\n };\n\n const clearFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n filters?.filter();\n };\n\n const restoreFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // `importConditions()` expects the same physical-column-indexed structure\n filters?.importConditions(savedConditions.current);\n filters?.filter();\n };\n\n return (\n <>\n
\n
\n \n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleSaveRestoreFilters.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Save and restore filter settings · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleSaveRestoreFilters\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnConditions } from 'handsontable/plugins/filters';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n const hotTableComponentRef = useRef(null);\n const savedConditions = useRef([]);\n\n const applySampleFilter = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n // filter the 'Price' column (column at index 2) for items over $200\n filters?.addCondition(2, 'gt', [200]);\n filters?.filter();\n };\n\n const saveFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // `exportConditions()` returns the current conditions, keyed by physical column index\n savedConditions.current = filters?.exportConditions() ?? [];\n };\n\n const clearFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n filters?.clearConditions();\n filters?.filter();\n };\n\n const restoreFilters = () => {\n const filters = hotTableComponentRef.current?.hotInstance?.getPlugin('filters');\n\n // `importConditions()` expects the same physical-column-indexed structure\n filters?.importConditions(savedConditions.current);\n filters?.filter();\n };\n\n return (\n <>\n
\n
\n \n \n \n \n
\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleSaveRestoreFilters.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSearchMode.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSearchMode.tsx.json index 6635c9773..12cf3befe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSearchMode.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleSearchMode.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleSearchMode\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleSearchMode.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleSearchMode\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleSearchMode.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleServerSideFilter.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleServerSideFilter.tsx.json index ded89b37a..2ba537390 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleServerSideFilter.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleServerSideFilter.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Server-side filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleServerSideFilter\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleServerSideFilter.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Server-side filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleServerSideFilter\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleServerSideFilter.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleShowFilterItemsOnly.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleShowFilterItemsOnly.tsx.json index 16d1123c5..cd8af82b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleShowFilterItemsOnly.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__react__exampleShowFilterItemsOnly.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleShowFilterItemsOnly\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleShowFilterItemsOnly.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column filter · Enable filtering · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"exampleShowFilterItemsOnly\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n {\n brand: 'Jetpulse',\n model: 'Racing Socks',\n price: 30,\n sellDate: '2023-10-11',\n sellTime: '01:23',\n inStock: false,\n },\n {\n brand: 'Gigabox',\n model: 'HL Mountain Frame',\n price: 1890.9,\n sellDate: '2023-05-03',\n sellTime: '11:27',\n inStock: false,\n },\n {\n brand: 'Camido',\n model: 'Cycling Cap',\n price: 130.1,\n sellDate: '2023-03-27',\n sellTime: '03:17',\n inStock: true,\n },\n {\n brand: 'Chatterpoint',\n model: 'Road Tire Tube',\n price: 59,\n sellDate: '2023-08-28',\n sellTime: '08:01',\n inStock: true,\n },\n {\n brand: 'Eidel',\n model: 'HL Road Tire',\n price: 279.99,\n sellDate: '2023-10-02',\n sellTime: '01:23',\n inStock: true,\n },\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-filter/react/exampleShowFilterItemsOnly.tsx","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleAvailableConditions.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleAvailableConditions.vue.json index 4c94c92b8..0b0412a3a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleAvailableConditions.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleAvailableConditions.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleAvailableConditions\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleAvailableConditions.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Choose the conditions the filter menu offers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleAvailableConditions\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleAvailableConditions.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleAvailableConditions","exampleTitle":"Choose the conditions the filter menu offers","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton.vue.json index c8d86b866..fbc55718a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Customize the filter button · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleCustomFilterButton\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleCustomFilterButton.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Customize the filter button · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleCustomFilterButton\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleCustomFilterButton.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton","exampleTitle":"Customize the filter button","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton2.vue.json index 09b512aee..849b03e06 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleCustomFilterButton2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Customize the filter button (3) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleCustomFilterButton2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleCustomFilterButton2.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Customize the filter button (3) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleCustomFilterButton2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleCustomFilterButton2.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleCustomFilterButton2","exampleTitle":"Customize the filter button (3)","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleDisableFilterForColumn.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleDisableFilterForColumn.vue.json index d5ee37fd6..e8a67a08a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleDisableFilterForColumn.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleDisableFilterForColumn.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleDisableFilterForColumn\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleDisableFilterForColumn.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering for individual columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleDisableFilterForColumn\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleDisableFilterForColumn.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleDisableFilterForColumn","exampleTitle":"Enable filtering for individual columns","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleEnableFilterInColumns.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleEnableFilterInColumns.vue.json index 1b3187e76..ad5ba3c20 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleEnableFilterInColumns.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleEnableFilterInColumns.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleEnableFilterInColumns\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleEnableFilterInColumns.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering for individual columns (3) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleEnableFilterInColumns\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleEnableFilterInColumns.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleEnableFilterInColumns","exampleTitle":"Enable filtering for individual columns (3)","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleExcludeRowsFromFiltering.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleExcludeRowsFromFiltering.vue.json index 7e6254f3c..942f87a70 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleExcludeRowsFromFiltering.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleExcludeRowsFromFiltering.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Exclude rows from filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleExcludeRowsFromFiltering\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleExcludeRowsFromFiltering.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Exclude rows from filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleExcludeRowsFromFiltering\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleExcludeRowsFromFiltering.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleExcludeRowsFromFiltering","exampleTitle":"Exclude rows from filtering","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterBasicDemo.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterBasicDemo.vue.json index d31a1eaa1..01aa0ef8a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterBasicDemo.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterBasicDemo.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Filtering demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterBasicDemo\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterBasicDemo.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Filtering demo · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterBasicDemo\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterBasicDemo.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterBasicDemo","exampleTitle":"Filtering demo","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterDifferentTypes.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterDifferentTypes.vue.json index 3b6184e99..701a13701 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterDifferentTypes.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterDifferentTypes.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Filter different types of data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterDifferentTypes\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterDifferentTypes.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Filter different types of data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterDifferentTypes\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterDifferentTypes.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterDifferentTypes","exampleTitle":"Filter different types of data","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterNestedHeaders.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterNestedHeaders.vue.json index e3cfd4a32..b6097c8a8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterNestedHeaders.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterNestedHeaders.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Filtering with nested headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterNestedHeaders\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterNestedHeaders.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Filtering with nested headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterNestedHeaders\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterNestedHeaders.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterNestedHeaders","exampleTitle":"Filtering with nested headers","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterOnInitialization.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterOnInitialization.vue.json index 3f708dbfc..9bfad3579 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterOnInitialization.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterOnInitialization.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Filter data on initialization · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterOnInitialization\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterOnInitialization.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Filter data on initialization · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterOnInitialization\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterOnInitialization.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterOnInitialization","exampleTitle":"Filter data on initialization","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterThroughAPI1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterThroughAPI1.vue.json index 96da513a3..0bd9a9169 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterThroughAPI1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterThroughAPI1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Filter data programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterThroughAPI1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterThroughAPI1.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Filter data programmatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterThroughAPI1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterThroughAPI1.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterThroughAPI1","exampleTitle":"Filter data programmatically","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterValueOrder.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterValueOrder.vue.json index 306c532f2..38bdc72f7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterValueOrder.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleFilterValueOrder.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterValueOrder\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterValueOrder.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Change the order of values in the filter list · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleFilterValueOrder\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleFilterValueOrder.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleFilterValueOrder","exampleTitle":"Change the order of values in the filter list","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleGetFilteredData.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleGetFilteredData.vue.json index 16215c98b..f8774c6b7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleGetFilteredData.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleGetFilteredData.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Get filtered data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleGetFilteredData\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleGetFilteredData.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Get filtered data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleGetFilteredData\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleGetFilteredData.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleGetFilteredData","exampleTitle":"Get filtered data","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleQuickFilter.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleQuickFilter.vue.json index 6960aa25c..7be17a89a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleQuickFilter.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleQuickFilter.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · External quick filter · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleQuickFilter\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleQuickFilter.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · External quick filter · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleQuickFilter\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleQuickFilter.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleQuickFilter","exampleTitle":"External quick filter","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSaveRestoreFilters.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSaveRestoreFilters.vue.json index 2c65c70be..421a256d5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSaveRestoreFilters.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSaveRestoreFilters.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Save and restore filter settings · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleSaveRestoreFilters\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleSaveRestoreFilters.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Save and restore filter settings · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleSaveRestoreFilters\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleSaveRestoreFilters.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSaveRestoreFilters","exampleTitle":"Save and restore filter settings","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSearchMode.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSearchMode.vue.json index 9ad69ab26..7e6e80898 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSearchMode.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleSearchMode.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleSearchMode\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleSearchMode.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering within already filtered results · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleSearchMode\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleSearchMode.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleSearchMode","exampleTitle":"Enable filtering within already filtered results","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleServerSideFilter.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleServerSideFilter.vue.json index 2e364c570..ae0e1d588 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleServerSideFilter.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleServerSideFilter.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Server-side filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleServerSideFilter\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleServerSideFilter.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Server-side filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleServerSideFilter\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleServerSideFilter.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleServerSideFilter","exampleTitle":"Server-side filtering","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleShowFilterItemsOnly.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleShowFilterItemsOnly.vue.json index 337f53b5e..a6cb41033 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleShowFilterItemsOnly.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-filter__vue__exampleShowFilterItemsOnly.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleShowFilterItemsOnly\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleShowFilterItemsOnly.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column filter · Enable filtering · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#exampleShowFilterItemsOnly\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-filter/vue/exampleShowFilterItemsOnly.vue","breadcrumb":["Columns","Column filter"],"guide":"guides/columns/column-filter/column-filter.md","guideTitle":"Column filter","exampleId":"exampleShowFilterItemsOnly","exampleTitle":"Enable filtering","docPermalink":"/column-filter","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example1.ts.json index 5b998d085..1cb37ab66 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData= new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example1.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData= new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example1.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example2.ts.json index ad9db4a8a..d5ead0e3c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · User-triggered freeze · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example2.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · User-triggered freeze · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example2.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example3.ts.json index a4f813484..bf48c5348 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze columns at the end · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\n@Component({\n selector: 'app-example3',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = data;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example3.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze columns at the end · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\n@Component({\n selector: 'app-example3',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = data;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example3.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example4.ts.json index e06e62296..fc8417ad1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze all four edges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\n@Component({\n selector: 'app-example4',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = data;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example4.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze all four edges · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\n@Component({\n selector: 'app-example4',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = data;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example4.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example5.ts.json index 05019d408..442b21f94 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n readonly hotData = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: this.colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example5.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n readonly hotData = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: this.colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example5.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example6.ts.json index c54a85f28..a4929b203 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData= new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example6.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData= new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-freezing/angular/example6.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.js.json index 7ab7bfa5c..5c6926027 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example1.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example1.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.ts.json index a83c267f2..4c8e765bb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example1.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example1.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.js.json index 0b7bc763a..fa98aedb8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · User-triggered freeze · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example2.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · User-triggered freeze · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example2.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.ts.json index ebbfe3074..81f1d3567 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · User-triggered freeze · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example2.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · User-triggered freeze · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 2,\n contextMenu: true,\n manualColumnFreeze: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example2.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.js.json index 42f0c3b01..0062a9d91 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze columns at the end · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example3.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze columns at the end · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example3.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.ts.json index 065c86cc3..e56b85667 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze columns at the end · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example3.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze columns at the end · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example3.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.js.json index 680bec428..ab3b4f4a0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze all four edges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus = Array.from({ length: 60 }, (_, row) => months.map((_, month) => 120 + ((row * 37 + month * 53) % 380)));\nconst sum = (values) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example4.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze all four edges · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus = Array.from({ length: 60 }, (_, row) => months.map((_, month) => 120 + ((row * 37 + month * 53) % 380)));\nconst sum = (values) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example4.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.ts.json index 5b1acf52e..36e4622d6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze all four edges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example4.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze all four edges · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', ...months, 'Total'],\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n fixedRowsTop: 1,\n fixedRowsBottom: 1,\n fixedColumnsStart: 1,\n fixedColumnsEnd: 1,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example4.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.js.json index ddd834987..905a6d1fc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colHeaders = [\n 'SKU',\n 'Product',\n 'Category',\n 'Supplier',\n 'Warehouse',\n 'In stock',\n 'Unit price',\n 'Rating',\n 'Last restock',\n 'Status',\n];\n\n// inventory data\nconst data = [\n [\n 'KB-1042',\n 'Mechanical Keyboard',\n 'Electronics',\n 'Alpine Supply Co.',\n 'Seattle',\n 142,\n 89.99,\n 4.6,\n '2025-03-14',\n 'Active',\n ],\n [\n 'WB-0093',\n 'Stainless Steel Water Bottle',\n 'Drinkware',\n 'Harbor Goods',\n 'Denver',\n 67,\n 24.5,\n 4.8,\n '2025-04-02',\n 'Active',\n ],\n [\n 'MS-2210',\n 'Wireless Mouse',\n 'Electronics',\n 'Alpine Supply Co.',\n 'Austin',\n 0,\n 34.99,\n 4.3,\n '2025-01-27',\n 'Discontinued',\n ],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n data,\n colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example5.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colHeaders = [\n 'SKU',\n 'Product',\n 'Category',\n 'Supplier',\n 'Warehouse',\n 'In stock',\n 'Unit price',\n 'Rating',\n 'Last restock',\n 'Status',\n];\n\n// inventory data\nconst data = [\n [\n 'KB-1042',\n 'Mechanical Keyboard',\n 'Electronics',\n 'Alpine Supply Co.',\n 'Seattle',\n 142,\n 89.99,\n 4.6,\n '2025-03-14',\n 'Active',\n ],\n [\n 'WB-0093',\n 'Stainless Steel Water Bottle',\n 'Drinkware',\n 'Harbor Goods',\n 'Denver',\n 67,\n 24.5,\n 4.8,\n '2025-04-02',\n 'Active',\n ],\n [\n 'MS-2210',\n 'Wireless Mouse',\n 'Electronics',\n 'Alpine Supply Co.',\n 'Austin',\n 0,\n 34.99,\n 4.3,\n '2025-01-27',\n 'Discontinued',\n ],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n data,\n colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example5.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.ts.json index 23e5df172..170562366 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n// inventory data\nconst data: (string | number)[][] = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data,\n colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example5.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n// inventory data\nconst data: (string | number)[][] = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data,\n colHeaders,\n colWidths: 110,\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n contextMenu: true,\n manualColumnMove: true,\n manualColumnFreeze: {\n restoreColumnPosition: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example5.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.js.json index 87ca94cf5..ec4f31295 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example6.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-freezing/javascript/example6.js","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.ts.json index 763bf2da4..4c82e95f5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example6.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedColumnsStart: 1,\n fixedRowsTop: 1,\n freezeBar: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-freezing/javascript/example6.ts","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example1.tsx.json index b53e9ce44..eb3d32242 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example1.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example1.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example2.tsx.json index 15769a280..cfd487384 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · User-triggered freeze · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example2.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · User-triggered freeze · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example2.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example3.tsx.json index c6b2da2a6..7fe559482 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze columns at the end · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example3.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze columns at the end · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst data: (string | number)[][] = Array.from({ length: 100 }, (_, row) => {\n const units = months.map((_, month) => 120 + ((row * 37 + month * 53) % 380));\n\n return [`SKU-${4000 + row}`, ...units, units.reduce((sum, value) => sum + value, 0)];\n});\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example3.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example4.tsx.json index d35eb1ba7..46290bccf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze all four edges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example4.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze all four edges · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\n// units sold per SKU and month, with the yearly total in the last column\nconst skus: number[][] = Array.from({ length: 60 }, (_, row) =>\n months.map((_, month) => 120 + ((row * 37 + month * 53) % 380))\n);\nconst sum = (values: number[]) => values.reduce((total, value) => total + value, 0);\nconst monthTotals = months.map((_, month) => sum(skus.map((units) => units[month])));\nconst data: (string | number)[][] = [\n ['Target', ...months.map(() => 18000), 216000],\n ...skus.map((units, row) => [`SKU-${4000 + row}`, ...units, sum(units)]),\n ['Total', ...monthTotals, sum(monthTotals)],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example4.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example5.tsx.json index 52b2a2a71..e0c9586aa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n// inventory data\nconst data = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example5.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst colHeaders = ['SKU', 'Product', 'Category', 'Supplier', 'Warehouse', 'In stock', 'Unit price', 'Rating', 'Last restock', 'Status'];\n\n// inventory data\nconst data = [\n ['KB-1042', 'Mechanical Keyboard', 'Electronics', 'Alpine Supply Co.', 'Seattle', 142, 89.99, 4.6, '2025-03-14', 'Active'],\n ['WB-0093', 'Stainless Steel Water Bottle', 'Drinkware', 'Harbor Goods', 'Denver', 67, 24.5, 4.8, '2025-04-02', 'Active'],\n ['MS-2210', 'Wireless Mouse', 'Electronics', 'Alpine Supply Co.', 'Austin', 0, 34.99, 4.3, '2025-01-27', 'Discontinued'],\n ['BP-4821', 'Waterproof Backpack', 'Apparel', 'Northwind Traders', 'Portland', 38, 79, 4.5, '2025-05-19', 'Active'],\n ['DL-3307', 'LED Desk Lamp', 'Home Office', 'Harbor Goods', 'Denver', 215, 42.75, 4.1, '2025-02-08', 'Active'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example5.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example6.tsx.json index a1850cf73..33ad1059b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example6.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-freezing/react/example6.tsx","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example1.vue.json index ea92edf22..a69356afd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example1.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example1.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example2.vue.json index 1f31d1b79..2edd03480 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · User-triggered freeze · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example2.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · User-triggered freeze · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example2.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example2","exampleTitle":"User-triggered freeze","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example3.vue.json index f0bde248b..9a0f5350a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze columns at the end · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example3.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze columns at the end · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example3.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example3","exampleTitle":"Freeze columns at the end","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example4.vue.json index 17bfc93a2..f2d03f446 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze all four edges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example4.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze all four edges · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example4.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example4","exampleTitle":"Freeze all four edges","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example5.vue.json index 0909cb5da..119836ce2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example5.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · Restore the column position on unfreeze · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example5.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example5","exampleTitle":"Restore the column position on unfreeze","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example6.vue.json index 497d5750c..5ee1ebcb9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-freezing__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example6.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column freezing · Freeze columns by dragging · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-freezing/vue/example6.vue","breadcrumb":["Columns","Column freezing"],"guide":"guides/columns/column-freezing/column-freezing.md","guideTitle":"Column freezing","exampleId":"example6","exampleTitle":"Freeze columns by dragging","docPermalink":"/column-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example1.ts.json index 449cdaa61..680c9f317 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column groups · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example1.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column groups · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example1.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example2.ts.json index 48d0e0f19..443c62ca4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column groups · Example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example2.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column groups · Example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example2.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example3.ts.json index e9b587cb4..eb6611233 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example3.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example3.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example4.ts.json index d16e59280..5e7190c54 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example4.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-groups/angular/example4.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.js.json index 2b9422927..14abd601f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column groups · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example1.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column groups · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example1.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.ts.json index 1ad011def..c97df581c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column groups · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example1.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column groups · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example1.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.js.json index 4698f869f..667da9686 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column groups · Example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example2.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column groups · Example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example2.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.ts.json index e0ade4120..6799f9f45 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column groups · Example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example2.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column groups · Example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 60,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n collapsibleColumns: [\n { row: -4, col: 1, collapsible: true },\n { row: -3, col: 1, collapsible: true },\n { row: -2, col: 1, collapsible: true },\n { row: -2, col: 3, collapsible: true },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example2.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.js.json index 0eb2a6005..6affa8c3e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example3.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example3.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.ts.json index 820a43244..9424f3b25 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example3.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n ],\n colHeaders: true,\n rowHeaders: true,\n colWidths: 90,\n height: 'auto',\n nestedHeaders: [\n ['Region', { label: 'Q1 2025', colspan: 4 }],\n [\n 'Region',\n { label: 'Jan', visibleWhen: 'expanded' },\n { label: 'Feb', visibleWhen: 'expanded' },\n { label: 'Mar', visibleWhen: 'expanded' },\n { label: 'Total', visibleWhen: 'collapsed' },\n ],\n ],\n collapsibleColumns: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example3.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.js.json index 3aa912009..6a3258efb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ],\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example4.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ],\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-groups/javascript/example4.js","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.ts.json index 62be820ea..8f0089a21 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ],\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example4.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n ],\n colHeaders: true,\n rowHeaders: ['North America', 'Europe', 'Asia Pacific', 'Latin America', 'Middle East'],\n rowHeaderWidth: 120,\n height: 'auto',\n manualColumnMove: true,\n nestedHeaders: [\n // Q1 2025 is cohesive (the default); Q2 2025 opts into splitting.\n [\n { label: 'Q1 2025 (adopt mode)', colspan: 3 },\n { label: 'Q2 2025 (split mode)', colspan: 3, columnDropMode: 'split' },\n ],\n ['January', 'February', 'March', 'April', 'May', 'June'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-groups/javascript/example4.ts","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example1.tsx.json index ff18bc9ed..ab704fa03 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column groups · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example1.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column groups · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example1.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example2.tsx.json index 33bae383a..fd362cf9b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column groups · Example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example2.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column groups · Example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example2.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example3.tsx.json index 287ab911c..af894e4e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example3.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['North America', 4200, 3800, 4500, 12500],\n ['Europe', 3100, 2900, 3300, 9300],\n ['Asia Pacific', 2600, 2400, 2800, 7800],\n ['Latin America', 1500, 1700, 1600, 4800],\n ['Middle East', 1200, 1300, 1450, 3950],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example3.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example4.tsx.json index 74ad24693..89441f09d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example4.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['$4.2M', '$3.8M', '$4.5M', '$4.1M', '$4.7M', '$5.2M'],\n ['$3.1M', '$2.9M', '$3.4M', '$3.6M', '$3.8M', '$4.0M'],\n ['$5.6M', '$5.9M', '$6.3M', '$6.1M', '$6.8M', '$7.2M'],\n ['$1.4M', '$1.6M', '$1.5M', '$1.7M', '$1.9M', '$2.1M'],\n ['$2.2M', '$2.0M', '$2.4M', '$2.5M', '$2.7M', '$2.9M'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-groups/react/example4.tsx","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example1.vue.json index 604a57110..e9dc572fc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column groups · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example1.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column groups · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example1.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-groups","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example2.vue.json index cdbc64bd0..a6c826d44 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column groups · Example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example2.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column groups · Example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example2.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example2","exampleTitle":"Example","docPermalink":"/column-groups","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example3.vue.json index 957d3a3e8..dbe9eb1d1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example3.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column groups · Choose which columns stay visible when collapsed · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example3.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example3","exampleTitle":"Choose which columns stay visible when collapsed","docPermalink":"/column-groups","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example4.vue.json index 778efc026..7b0c418bc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-groups__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example4.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column groups · Keep a group cohesive or let it split · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-groups/vue/example4.vue","breadcrumb":["Columns","Column groups"],"guide":"guides/columns/column-groups/column-groups.md","guideTitle":"Column groups","exampleId":"example4","exampleTitle":"Keep a group cohesive or let it split","docPermalink":"/column-groups","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example1.ts.json index 9e5360693..bfc66f3dc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example1.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n nestedHeaders: [\n ['A', { label: 'B', colspan: 8 }, 'C'],\n ['D', { label: 'E', colspan: 4 }, { label: 'F', colspan: 4 }, 'G'],\n [\n 'H',\n { label: 'I', colspan: 2 },\n { label: 'J', colspan: 2 },\n { label: 'K', colspan: 2 },\n { label: 'L', colspan: 2 },\n 'M',\n ],\n ['N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example1.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example2.ts.json index a2f09cbf5..1a22483a7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels as an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example2.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels as an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example2.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example3.ts.json index 322c33a28..1c3fa633c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly columnHeaders = ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'];\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n // Number each header with its column position, something a plain array can't do.\n colHeaders: (index: number) => {\n return `${index + 1}. ${this.columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example3.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly columnHeaders = ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'];\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n // Number each header with its column position, something a plain array can't do.\n colHeaders: (index: number) => {\n return `${index + 1}. ${this.columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example3.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example4.ts.json index 416f04962..4b64f9d3c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Customize column headers · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example4.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Customize column headers · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example4.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example5.ts.json index d9aba97ab..f748abc8b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Customize column headers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n .bold-text {\n font-weight: bold;\n }\n .italic-text {\n font-style: italic;\n }\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example5.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Customize column headers (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n styles: `\n :host ::ng-deep {\n .bold-text {\n font-weight: bold;\n }\n .italic-text {\n font-style: italic;\n }\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example5.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example6.ts.json index bff29ee05..37cdf6a5b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels in the columns option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n { title: 'Atomic Mass (u)', type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { title: 'Known Isotopes', type: 'numeric' },\n { title: 'Melting Point (°F)', type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { title: 'Boiling Point (°F)', type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example6.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Header labels in the columns option · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n { title: 'Atomic Mass (u)', type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { title: 'Known Isotopes', type: 'numeric' },\n { title: 'Melting Point (°F)', type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { title: 'Boiling Point (°F)', type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example6.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example7.ts.json index 7087dda26..561b38b52 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column headers · Column header height · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example7',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example7.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column headers · Column header height · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example7',\n template: `\n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-header/angular/example7.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.js.json index d8ba9dcf8..7a428711d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: true,\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example1.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: true,\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example1.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.ts.json index b9286825d..fb429627f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: true,\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example1.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: true,\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example1.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.js.json index af197c5e3..53ff43eaf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels as an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example2.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels as an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example2.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.ts.json index 700624936..e8b09494e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels as an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example2.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels as an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example2.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.js.json index 13623204f..aa4d07480 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst columnHeaders = [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n];\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Number each header with its column position, something a plain array can't do.\n colHeaders(index) {\n return `${index + 1}. ${columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example3.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst columnHeaders = [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n];\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Number each header with its column position, something a plain array can't do.\n colHeaders(index) {\n return `${index + 1}. ${columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example3.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.ts.json index 86cdb0435..06b0e578a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\nconst columnHeaders = [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n];\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Number each header with its column position, something a plain array can't do.\n colHeaders(index: number) {\n return `${index + 1}. ${columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example3.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\nconst columnHeaders = [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n];\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Number each header with its column position, something a plain array can't do.\n colHeaders(index: number) {\n return `${index + 1}. ${columnHeaders[index]}`;\n },\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example3.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.js.json index 0ed1be12f..3d6f3f59e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Customize column headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example4.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Customize column headers · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example4.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.ts.json index b62ce512b..f55cb7735 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Customize column headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example4.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Customize column headers · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htCenter',\n columns: [{ headerClassName: 'htRight' }, { headerClassName: 'htLeft' }, { type: 'numeric' }],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example4.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.js.json index b5b713203..33001f161 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Customize column headers (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/javascript/example5.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Customize column headers (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/javascript/example5.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.ts.json index 0bfa1c5a0..76fe36f8d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Customize column headers (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/javascript/example5.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Customize column headers (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\nconst hot = new Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)'],\n rowHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n stretchH: 'all',\n headerClassName: 'htLeft',\n columns: [\n { headerClassName: 'italic-text' },\n { headerClassName: 'bold-text italic-text' },\n { headerClassName: 'htRight bold-text italic-text', type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/javascript/example5.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.js.json index 4b58dd424..ac1d4a096 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels in the columns option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n {\n title: 'Atomic Mass (u)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false },\n },\n { title: 'Known Isotopes', type: 'numeric' },\n {\n title: 'Melting Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n {\n title: 'Boiling Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example6.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Header labels in the columns option · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n {\n title: 'Atomic Mass (u)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false },\n },\n { title: 'Known Isotopes', type: 'numeric' },\n {\n title: 'Melting Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n {\n title: 'Boiling Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example6.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.ts.json index edcb2996a..158d0c63b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels in the columns option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n {\n title: 'Atomic Mass (u)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false },\n },\n { title: 'Known Isotopes', type: 'numeric' },\n {\n title: 'Melting Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n {\n title: 'Boiling Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example6.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Header labels in the columns option · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n // Set each column header label with the `title` option inside `columns`.\n columns: [\n { title: 'Name' },\n { title: 'Symbol' },\n { title: 'Atomic Number', type: 'numeric' },\n {\n title: 'Atomic Mass (u)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false },\n },\n { title: 'Known Isotopes', type: 'numeric' },\n {\n title: 'Melting Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n {\n title: 'Boiling Point (°F)',\n type: 'numeric',\n numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false },\n },\n ],\n rowHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example6.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.js.json index dadb004d6..e72fad9d0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column headers · Column header height · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example7.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column headers · Column header height · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7');\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-header/javascript/example7.js","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.ts.json index 43b8b136f..d7bc8ba85 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__javascript__example7.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column headers · Column header height · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example7.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column headers · Column header height · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7')!;\nnew Handsontable(container, {\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n ],\n colHeaders: [\n 'Name',\n 'Symbol',\n 'Atomic Number',\n 'Atomic Mass (u)',\n 'Known Isotopes',\n 'Melting Point (°F)',\n 'Boiling Point (°F)',\n ],\n columns: [\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ],\n rowHeaders: true,\n // Wide enough that no label gets cut off by the header's ellipsis truncation.\n colWidths: [90, 90, 120, 130, 120, 155, 155],\n columnHeaderHeight: 50,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-header/javascript/example7.ts","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example1.tsx.json index 4b568f20e..63919e40a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example1.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example1.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example2.tsx.json index 03fe12400..6a481490d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Header labels as an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example2.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Header labels as an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example2.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example3.tsx.json index 841ed48fd..1703fe425 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Header labels as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst columnHeaders = ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'];\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n return `${index + 1}. ${columnHeaders[index]}`;\n }}\n columns={[\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ]}\n rowHeaders={true}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example3.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Header labels as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst columnHeaders = ['Name', 'Symbol', 'Atomic Number', 'Atomic Mass (u)', 'Known Isotopes', 'Melting Point (°F)', 'Boiling Point (°F)'];\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n return `${index + 1}. ${columnHeaders[index]}`;\n }}\n columns={[\n {},\n {},\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 3, maximumFractionDigits: 3, useGrouping: false } },\n { type: 'numeric' },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n { type: 'numeric', numericFormat: { minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: false } },\n ]}\n rowHeaders={true}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example3.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example4.tsx.json index 651b2d914..6eaaa4183 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Customize column headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example4.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Customize column headers · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1],\n ['Helium', 'He', 2],\n ['Lithium', 'Li', 3],\n ['Beryllium', 'Be', 4],\n ['Boron', 'B', 5],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example4.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example5.tsx.json index 789004e9d..d85a05c3a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Customize column headers (2) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/react/example5.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Customize column headers (2) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".bold-text {\n font-weight: bold;\n}\n\n.italic-text {\n font-style: italic;\n}"},"docsPath":"guides/columns/column-header/react/example5.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example6.tsx.json index f7018b953..92444846c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Header labels in the columns option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example6.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Header labels in the columns option · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example6.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example7.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example7.tsx.json index 416983c8d..577c59779 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example7.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__react__example7.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column headers · Column header height · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example7.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column headers · Column header height · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7, -434.4, -423.2],\n ['Helium', 'He', 2, 4.003, 9, -458.0, -452.1],\n ['Lithium', 'Li', 3, 6.94, 9, 356.9, 2447.6],\n ['Beryllium', 'Be', 4, 9.012, 11, 2348.6, 4478.8],\n ['Boron', 'B', 5, 10.81, 15, 3768.8, 7100.6],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-header/react/example7.tsx","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example1.vue.json index f603c36ca..3c7536b8e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example1.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example1.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example2.vue.json index 09625f704..610193419 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels as an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example2.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels as an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example2.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example2","exampleTitle":"Header labels as an array","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example3.vue.json index 0a868bd45..2f3141cf5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example3.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example3.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example3","exampleTitle":"Header labels as a function","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example4.vue.json index 739a4ce79..f69519ac8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Customize column headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example4.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Customize column headers · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example4.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example4","exampleTitle":"Customize column headers","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example5.vue.json index 4fec66190..dec48e840 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Customize column headers (2) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-header/vue/example5.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Customize column headers (2) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/columns/column-header/vue/example5.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example5","exampleTitle":"Customize column headers (2)","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example6.vue.json index 68648871a..fc176a7ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels in the columns option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example6.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Header labels in the columns option · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example6.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example6","exampleTitle":"Header labels in the columns option","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example7.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example7.vue.json index 88d96ae58..53853183f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example7.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-header__vue__example7.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Columns ▸ Column headers · Column header height · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example7.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Columns ▸ Column headers · Column header height · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/columns/column-header/vue/example7.vue","breadcrumb":["Columns","Column headers"],"guide":"guides/columns/column-header/column-header.md","guideTitle":"Column headers","exampleId":"example7","exampleTitle":"Column header height","docPermalink":"/column-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example1.ts.json index d0b225e55..520b9c3b0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example1.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example1.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example2.ts.json index ce02727d1..e0ede2fad 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example2.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example2.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example3.ts.json index 11a87a6bf..aa26a52ab 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example3.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example3.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example4.ts.json index 605efe91c..e52a845e9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example4.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example4.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example5.ts.json index 1f4b394f8..2f5f7fcee 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example5.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example5.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example6.ts.json index 605e78396..535cc5c8a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example6.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/columns/column-hiding/angular/example6.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.js.json index 54b5ba1eb..1ce54dc86 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example1.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example1.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.ts.json index 40f711689..5954b8cca 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example1.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n columns: [2, 4, 6],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example1.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.js.json index 8ab9aceaf..b5dcbfe14 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example2.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example2.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.ts.json index b47bceaa4..ae3fbd11d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example2.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenColumns` plugin\n hiddenColumns: {\n // specify columns hidden by default\n columns: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example2.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example2","exampleTitle":"Step 1: Specify columns hidden by default","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.js.json index 6dbe72553..7f35e9865 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example3.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example3.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.ts.json index d137347ad..7955e1c54 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example3.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 2: Show UI indicators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n hiddenColumns: {\n columns: [3, 5, 9],\n // show UI indicators to mark hidden columns\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example3.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.js.json index 248bf2b34..fb6dedd1c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example4.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example4.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.ts.json index f1ba2ceb2..d6f89d95e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example4.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenColumns` plugin\n // automatically adds the context menu's column hiding items\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example4.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.js.json index 0215d6a6b..4f0810d59 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example5.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example5.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.ts.json index 0dd355f37..1663f8138 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example5.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 3: Set up context menu items (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n // individually add column hiding context menu items\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example5.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.js.json index 7b215d458..11b0c39ec 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example6.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/columns/column-hiding/javascript/example6.js","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.ts.json index 698c44cba..d85263cd4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example6.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Columns ▸ Column hiding · Step 4: Set up copy and paste behavior · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n ],\n height: 200,\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_columns_show', 'hidden_columns_hide'],\n hiddenColumns: {\n columns: [3, 5, 9],\n indicators: true,\n // exclude hidden columns from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/columns/column-hiding/javascript/example6.ts","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/column-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example1.tsx.json index ba896bf16..8bae2fdf2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column hiding · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-hiding/react/example1.tsx","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"React (TS)"} +{"framework":"react","displayName":"Columns ▸ Column hiding · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/columns/column-hiding/react/example1.tsx","breadcrumb":["Columns","Column hiding"],"guide":"guides/columns/column-hiding/column-hiding.md","guideTitle":"Column hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/column-hiding","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example2.tsx.json index 3d39f5edc..e9c582986 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__columns__column-hiding__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Columns ▸ Column hiding · Step 1: Specify columns hidden by default · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle', 142, 24.99, 40, 'In stock', '2026-03-12'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver', 0, 29.5, 25, 'Backorder', '2026-01-08'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland', 67, 349, 20, 'In stock', '2026-04-21'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin', 215, 12.99, 80, 'In stock', '2026-02-17'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis', 38, 89, 30, 'Low stock', '2026-05-03'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston', 190, 18.5, 50, 'In stock', '2026-03-29'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago', 54, 45, 20, 'In stock', '2026-06-11'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix', 88, 32, 24, 'In stock', '2026-04-02'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta', 12, 54.99, 15, 'Low stock', '2026-07-19'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas', 73, 79, 20, 'In stock', '2026-05-28'],\n];\n\nconst ExampleComponent = () => {\n return (\n
\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/loading/react/example3.tsx","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example3","exampleTitle":"Real-world usage","docPermalink":"/loading","lang":"React (TS)"} +{"framework":"react","displayName":"Dialog ▸ Loading · Real-world usage · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef, useState } from 'react';\nimport { HotTable, HotColumn, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst Table = ({ hotTableRef, data }: { hotTableRef: React.RefObject; data: any[] }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n );\n};\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n const [data, setData] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n\n // Simulate data loading\n const loadData = async () => {\n const hotInstance = hotTableRef.current?.hotInstance;\n\n if (!hotInstance) {\n return;\n }\n\n const loadingPlugin = hotInstance.getPlugin('loading');\n\n setIsLoading(true);\n\n // Show loading dialog\n loadingPlugin.show();\n\n try {\n // Simulate API call delay\n await new Promise((resolve) => setTimeout(resolve, 3000));\n\n // Simulated data\n setData([\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n ]);\n\n // Load data into the table\n hotTableRef.current?.hotInstance?.loadData(data);\n\n // Hide loading dialog\n loadingPlugin.hide();\n\n setIsLoading(false);\n } catch (error) {\n // Handle error\n setTimeout(() => {\n loadingPlugin.hide();\n setIsLoading(false);\n }, 2000);\n }\n };\n\n return (\n <>\n
\n
\n \n
\n
\n
\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/loading/react/example3.tsx","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example3","exampleTitle":"Real-world usage","docPermalink":"/loading","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__react__example4.tsx.json index f7dad1ea6..e6834c129 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Dialog ▸ Loading · Loading with Pagination plugin · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef, useState, useEffect } from 'react';\nimport { HotTable, HotColumn, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst Table = React.memo(({ hotTableRef, data }: { hotTableRef: React.RefObject; data: any[] }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n );\n});\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n const paginationContainerRef = useRef(null);\n const [data, setData] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n const paginationContainer = paginationContainerRef?.current;\n const hot = hotTableRef.current?.hotInstance;\n\n if (!hot || !paginationContainer) {\n return;\n }\n\n hot.updateSettings({\n pagination: {\n uiContainer: paginationContainer,\n },\n });\n\n // Add hooks to show and hide the pagination container overlay\n hot.addHook('afterLoadingShow', () => {\n paginationContainer.classList.add('overlay');\n });\n\n hot.addHook('afterLoadingHide', () => {\n paginationContainer.classList.remove('overlay');\n });\n }, []);\n\n // Simulate data loading\n const loadData = async () => {\n const hotInstance = hotTableRef.current?.hotInstance;\n\n if (!hotInstance) {\n return;\n }\n\n const loadingPlugin = hotInstance.getPlugin('loading');\n\n setIsLoading(true);\n // Show loading dialog\n loadingPlugin.show();\n\n try {\n // Simulate API call delay\n await new Promise((resolve) => setTimeout(resolve, 3000));\n // Simulated data\n setData([\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n ]);\n // Load data into the table\n hotTableRef.current?.hotInstance?.loadData(data);\n // Hide loading dialog\n loadingPlugin.hide();\n setIsLoading(false);\n } catch (error) {\n // Handle error\n setTimeout(() => {\n loadingPlugin.hide();\n setIsLoading(false);\n }, 2000);\n }\n };\n\n return (\n <>\n
\n
\n
\n \n
\n
\n
\n

\n This is a demonstration of how to use the Loading plugin with pagination in external container. You need to\n create pagination overlay manually, after that you can use the afterLoadingShow and{' '}\n afterLoadingHide hooks to show and hide the pagination container overlay.\n

\n
\n
\n
\n
\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".example4-pagination {\n position: relative;\n}\n\n.example4-pagination.overlay .ht-pagination::before {\n content: \"\";\n display: block;\n width: 100%;\n height: 100%;\n background-color: var(--ht-dialog-semi-transparent-background-color);\n position: absolute;\n inset: 0;\n z-index: 1000;\n}"},"docsPath":"guides/dialog/loading/react/example4.tsx","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example4","exampleTitle":"Loading with Pagination plugin","docPermalink":"/loading","lang":"React (TS)"} +{"framework":"react","displayName":"Dialog ▸ Loading · Loading with Pagination plugin · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef, useState, useEffect } from 'react';\nimport { HotTable, HotColumn, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst Table = React.memo(({ hotTableRef, data }: { hotTableRef: React.RefObject; data: any[] }) => {\n return (\n <>\n \n \n \n \n \n \n \n \n );\n});\n\nconst ExampleComponent = () => {\n const hotTableRef = useRef(null);\n const paginationContainerRef = useRef(null);\n const [data, setData] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n\n useEffect(() => {\n const paginationContainer = paginationContainerRef?.current;\n const hot = hotTableRef.current?.hotInstance;\n\n if (!hot || !paginationContainer) {\n return;\n }\n\n hot.updateSettings({\n pagination: {\n uiContainer: paginationContainer,\n },\n });\n\n // Add hooks to show and hide the pagination container overlay\n hot.addHook('afterLoadingShow', () => {\n paginationContainer.classList.add('overlay');\n });\n\n hot.addHook('afterLoadingHide', () => {\n paginationContainer.classList.remove('overlay');\n });\n }, []);\n\n // Simulate data loading\n const loadData = async () => {\n const hotInstance = hotTableRef.current?.hotInstance;\n\n if (!hotInstance) {\n return;\n }\n\n const loadingPlugin = hotInstance.getPlugin('loading');\n\n setIsLoading(true);\n // Show loading dialog\n loadingPlugin.show();\n\n try {\n // Simulate API call delay\n await new Promise((resolve) => setTimeout(resolve, 3000));\n // Simulated data\n setData([\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n ]);\n // Load data into the table\n hotTableRef.current?.hotInstance?.loadData(data);\n // Hide loading dialog\n loadingPlugin.hide();\n setIsLoading(false);\n } catch (error) {\n // Handle error\n setTimeout(() => {\n loadingPlugin.hide();\n setIsLoading(false);\n }, 2000);\n }\n };\n\n return (\n <>\n
\n
\n
\n \n
\n
\n
\n

\n This is a demonstration of how to use the Loading plugin with pagination in external container. You need to\n create pagination overlay manually, after that you can use the afterLoadingShow and{' '}\n afterLoadingHide hooks to show and hide the pagination container overlay.\n

\n
\n
\n
\n
\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".example4-pagination {\n position: relative;\n}\n\n.example4-pagination.overlay .ht-pagination::before {\n content: \"\";\n display: block;\n width: 100%;\n height: 100%;\n background-color: var(--ht-dialog-semi-transparent-background-color);\n position: absolute;\n inset: 0;\n z-index: 1000;\n}"},"docsPath":"guides/dialog/loading/react/example4.tsx","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example4","exampleTitle":"Loading with Pagination plugin","docPermalink":"/loading","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example1.vue.json index 2020d348a..77081f870 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Loading · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example1.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/loading","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Loading · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example1.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/loading","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example2.vue.json index f05892dd7..018783166 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Loading · Custom configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example2.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/loading","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Loading · Custom configuration · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example2.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example2","exampleTitle":"Custom configuration","docPermalink":"/loading","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example3.vue.json index 1b763d4a9..b3c16deed 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Loading · Real-world usage · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example3.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example3","exampleTitle":"Real-world usage","docPermalink":"/loading","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Loading · Real-world usage · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/loading/vue/example3.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example3","exampleTitle":"Real-world usage","docPermalink":"/loading","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example4.vue.json index 749f4d2b2..f18de9428 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__loading__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Loading · Loading with Pagination plugin · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n","/src/styles.css":".example4-pagination {\n position: relative;\n}\n\n.example4-pagination.overlay .ht-pagination::before {\n content: \"\";\n display: block;\n width: 100%;\n height: 100%;\n background-color: var(--ht-dialog-semi-transparent-background-color);\n position: absolute;\n inset: 0;\n z-index: 1000;\n}"},"docsPath":"guides/dialog/loading/vue/example4.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example4","exampleTitle":"Loading with Pagination plugin","docPermalink":"/loading","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Loading · Loading with Pagination plugin · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n","/src/styles.css":".example4-pagination {\n position: relative;\n}\n\n.example4-pagination.overlay .ht-pagination::before {\n content: \"\";\n display: block;\n width: 100%;\n height: 100%;\n background-color: var(--ht-dialog-semi-transparent-background-color);\n position: absolute;\n inset: 0;\n z-index: 1000;\n}"},"docsPath":"guides/dialog/loading/vue/example4.vue","breadcrumb":["Dialog","Loading"],"guide":"guides/dialog/loading/loading.md","guideTitle":"Loading","exampleId":"example4","exampleTitle":"Loading with Pagination plugin","docPermalink":"/loading","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example1.ts.json index 83aa6b026..db02fc875 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Dialog ▸ Notification · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'notification-example',\n template: ``,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n afterInit(this: Handsontable) {\n const notification = this.getPlugin('notification');\n\n notification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n });\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/dialog/notification/angular/example1.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"Angular"} +{"framework":"angular","displayName":"Dialog ▸ Notification · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'notification-example',\n template: ``,\n})\nexport class AppComponent {\n readonly hotData = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n afterInit(this: Handsontable) {\n const notification = this.getPlugin('notification');\n\n notification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n });\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/dialog/notification/angular/example1.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example2.ts.json index eac7de634..3fd043a8b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableModule, HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'notification-example-2',\n template: `\n
\n
\n \n \n \n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable', { static: false }) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n };\n\n onSave(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('notification').showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n }\n\n onSyncError(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const plugin = hot.getPlugin('notification');\n\n plugin.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n }\n\n onLowStock(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('notification').showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/dialog/notification/angular/example2.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"Angular"} +{"framework":"angular","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableModule, HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'notification-example-2',\n template: `\n
\n
\n \n \n \n
\n
\n \n `,\n})\nexport class AppComponent {\n @ViewChild('hotTable', { static: false }) hotTable!: HotTableComponent;\n\n readonly hotData = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n };\n\n onSave(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('notification').showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n }\n\n onSyncError(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const plugin = hot.getPlugin('notification');\n\n plugin.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n }\n\n onLowStock(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('notification').showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/dialog/notification/angular/example2.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.js.json index 90d5f157c..ac9c58e17 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Dialog ▸ Notification · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n [\n 'Review pricing sheet',\n 'Draft',\n 'Apr 12',\n 'Morgan Lee',\n 'Medium',\n 'Finance',\n ],\n [\n 'Ship partner samples',\n 'In progress',\n 'Apr 14',\n 'Jordan Kim',\n 'High',\n 'Sales',\n ],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n [\n 'New client onboarding',\n 'Blocked',\n 'Apr 18',\n 'Riley Patel',\n 'High',\n 'Success',\n ],\n [\n 'Update documentation',\n 'Draft',\n 'Apr 20',\n 'Casey Ruiz',\n 'Low',\n 'Engineering',\n ],\n [\n 'Audit vendor contracts',\n 'In progress',\n 'Apr 22',\n 'Morgan Lee',\n 'Medium',\n 'Legal',\n ],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n [\n 'Fix login timeout bug',\n 'In progress',\n 'Apr 16',\n 'Devon Walsh',\n 'High',\n 'Engineering',\n ],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n [\n 'Migrate legacy CRM rows',\n 'Blocked',\n 'Apr 28',\n 'Alex Rivera',\n 'High',\n 'Engineering',\n ],\n [\n 'Schedule user interviews',\n 'Draft',\n 'Apr 19',\n 'Riley Patel',\n 'Medium',\n 'Product',\n ],\n [\n 'Approve expense policy',\n 'In progress',\n 'Apr 21',\n 'Morgan Lee',\n 'Low',\n 'Finance',\n ],\n [\n 'Localize help center',\n 'Draft',\n 'May 2',\n 'Sam Okafor',\n 'Medium',\n 'Marketing',\n ],\n [\n 'Load test checkout API',\n 'In progress',\n 'Apr 17',\n 'Devon Walsh',\n 'High',\n 'Engineering',\n ],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst container = document.getElementById('example1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst notification = hot.getPlugin('notification');\n\nnotification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/dialog/notification/javascript/example1.js","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"JavaScript"} +{"framework":"javascript","displayName":"Dialog ▸ Notification · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n [\n 'Review pricing sheet',\n 'Draft',\n 'Apr 12',\n 'Morgan Lee',\n 'Medium',\n 'Finance',\n ],\n [\n 'Ship partner samples',\n 'In progress',\n 'Apr 14',\n 'Jordan Kim',\n 'High',\n 'Sales',\n ],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n [\n 'New client onboarding',\n 'Blocked',\n 'Apr 18',\n 'Riley Patel',\n 'High',\n 'Success',\n ],\n [\n 'Update documentation',\n 'Draft',\n 'Apr 20',\n 'Casey Ruiz',\n 'Low',\n 'Engineering',\n ],\n [\n 'Audit vendor contracts',\n 'In progress',\n 'Apr 22',\n 'Morgan Lee',\n 'Medium',\n 'Legal',\n ],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n [\n 'Fix login timeout bug',\n 'In progress',\n 'Apr 16',\n 'Devon Walsh',\n 'High',\n 'Engineering',\n ],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n [\n 'Migrate legacy CRM rows',\n 'Blocked',\n 'Apr 28',\n 'Alex Rivera',\n 'High',\n 'Engineering',\n ],\n [\n 'Schedule user interviews',\n 'Draft',\n 'Apr 19',\n 'Riley Patel',\n 'Medium',\n 'Product',\n ],\n [\n 'Approve expense policy',\n 'In progress',\n 'Apr 21',\n 'Morgan Lee',\n 'Low',\n 'Finance',\n ],\n [\n 'Localize help center',\n 'Draft',\n 'May 2',\n 'Sam Okafor',\n 'Medium',\n 'Marketing',\n ],\n [\n 'Load test checkout API',\n 'In progress',\n 'Apr 17',\n 'Devon Walsh',\n 'High',\n 'Engineering',\n ],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst container = document.getElementById('example1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst notification = hot.getPlugin('notification');\n\nnotification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/dialog/notification/javascript/example1.js","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.ts.json index 65a018d87..26f228c1b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Dialog ▸ Notification · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst container = document.getElementById('example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst notification = hot.getPlugin('notification');\n\nnotification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/dialog/notification/javascript/example1.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"TypeScript"} +{"framework":"typescript","displayName":"Dialog ▸ Notification · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst container = document.getElementById('example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Status', 'Due', 'Owner', 'Priority', 'Team'],\n columns: [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 420,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst notification = hot.getPlugin('notification');\n\nnotification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n});\nnotification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/dialog/notification/javascript/example1.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.js.json index a7807e692..069a36c57 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst container = document.getElementById('example2');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst plugin = hot.getPlugin('notification');\n\ndocument.getElementById('example2-save').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n});\n\ndocument.getElementById('example2-sync-error').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Sync failed',\n message:\n 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n});\n\ndocument.getElementById('example2-low-stock').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/dialog/notification/javascript/example2.js","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"JavaScript"} +{"framework":"javascript","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst container = document.getElementById('example2');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst plugin = hot.getPlugin('notification');\n\ndocument.getElementById('example2-save').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n});\n\ndocument.getElementById('example2-sync-error').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Sync failed',\n message:\n 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n});\n\ndocument.getElementById('example2-low-stock').addEventListener('click', () => {\n plugin.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/dialog/notification/javascript/example2.js","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.ts.json index a37cff442..f646e8a48 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst container = document.getElementById('example2')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst plugin = hot.getPlugin('notification');\n\ndocument.getElementById('example2-save')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n});\n\ndocument.getElementById('example2-sync-error')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n});\n\ndocument.getElementById('example2-low-stock')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/dialog/notification/javascript/example2.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"TypeScript"} +{"framework":"typescript","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n \n
\n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst container = document.getElementById('example2')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Qty on hand', 'Reorder at', 'Bin'],\n columns: [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n ],\n rowHeaders: true,\n width: '100%',\n height: 280,\n notification: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst plugin = hot.getPlugin('notification');\n\ndocument.getElementById('example2-save')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n});\n\ndocument.getElementById('example2-sync-error')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n});\n\ndocument.getElementById('example2-low-stock')!.addEventListener('click', () => {\n plugin.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/dialog/notification/javascript/example2.ts","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example1.tsx.json index 6c971bf6c..47248f49d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Dialog ▸ Notification · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst columns: Handsontable.ColumnSettings[] = [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotTableRef = useRef(null);\n\n useEffect(() => {\n const hot = hotTableRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const notification = hot.getPlugin('notification');\n\n notification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n });\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/notification/react/example1.tsx","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"React (TS)"} +{"framework":"react","displayName":"Dialog ▸ Notification · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['Review pricing sheet', 'Draft', 'Apr 12', 'Morgan Lee', 'Medium', 'Finance'],\n ['Ship partner samples', 'In progress', 'Apr 14', 'Jordan Kim', 'High', 'Sales'],\n ['Q2 revenue forecast', 'Done', 'Apr 8', 'Avery Chen', 'Low', 'Finance'],\n ['New client onboarding', 'Blocked', 'Apr 18', 'Riley Patel', 'High', 'Success'],\n ['Update documentation', 'Draft', 'Apr 20', 'Casey Ruiz', 'Low', 'Engineering'],\n ['Audit vendor contracts', 'In progress', 'Apr 22', 'Morgan Lee', 'Medium', 'Legal'],\n ['Refresh brand assets', 'Draft', 'Apr 25', 'Sam Okafor', 'Low', 'Marketing'],\n ['Fix login timeout bug', 'In progress', 'Apr 16', 'Devon Walsh', 'High', 'Engineering'],\n ['Prep board deck', 'Done', 'Apr 10', 'Jordan Kim', 'Medium', 'Exec'],\n ['Migrate legacy CRM rows', 'Blocked', 'Apr 28', 'Alex Rivera', 'High', 'Engineering'],\n ['Schedule user interviews', 'Draft', 'Apr 19', 'Riley Patel', 'Medium', 'Product'],\n ['Approve expense policy', 'In progress', 'Apr 21', 'Morgan Lee', 'Low', 'Finance'],\n ['Localize help center', 'Draft', 'May 2', 'Sam Okafor', 'Medium', 'Marketing'],\n ['Load test checkout API', 'In progress', 'Apr 17', 'Devon Walsh', 'High', 'Engineering'],\n ['Quarterly OKR check-in', 'Done', 'Apr 9', 'Avery Chen', 'Low', 'Exec'],\n];\n\nconst columns: Handsontable.ColumnSettings[] = [\n { data: 0, type: 'text', width: 200 },\n { data: 1, type: 'text', width: 105 },\n { data: 2, type: 'text', width: 72 },\n { data: 3, type: 'text', width: 120 },\n { data: 4, type: 'text', width: 80 },\n { data: 5, type: 'text', width: 100 },\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotTableRef = useRef(null);\n\n useEffect(() => {\n const hot = hotTableRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const notification = hot.getPlugin('notification');\n\n notification.showMessage({\n title: 'Top start',\n message: 'Info toast in the top-start corner.',\n variant: 'info',\n position: 'top-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Top end',\n message: 'Success toast in the top-end corner.',\n variant: 'success',\n position: 'top-end',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom start',\n message: 'Warning toast in the bottom-start corner.',\n variant: 'warning',\n position: 'bottom-start',\n duration: 0,\n });\n notification.showMessage({\n title: 'Bottom end',\n message: 'Error toast in the bottom-end corner.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n });\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/notification/react/example1.tsx","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example2.tsx.json index fec9c9faa..8e3147b4a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst columns: Handsontable.ColumnSettings[] = [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotTableRef = useRef(null);\n\n const getPlugin = () => hotTableRef.current?.hotInstance?.getPlugin('notification');\n\n const onSave = () => {\n getPlugin()?.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n };\n\n const onSyncError = () => {\n const plugin = getPlugin();\n\n plugin?.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n };\n\n const onLowStock = () => {\n getPlugin()?.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n };\n\n return (\n
\n
\n
\n \n \n \n
\n
\n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/notification/react/example2.tsx","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"React (TS)"} +{"framework":"react","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n ['SKU-001', 'Alkaline AA 4pk', 240, 40, 'A-12'],\n ['SKU-002', 'USB-C cable 1m', 18, 24, 'B-03'],\n ['SKU-003', 'Notebook A5 ruled', 0, 30, 'C-01'],\n ['SKU-004', 'Wireless mouse', 6, 15, 'B-07'],\n ['SKU-005', 'HDMI cable 2m', 2, 10, 'A-04'],\n ['SKU-006', 'Desk lamp LED', 45, 12, 'D-02'],\n ['SKU-007', 'Laptop stand aluminum', 0, 8, 'C-14'],\n ['SKU-008', 'Mechanical keycap set', 112, 20, 'B-01'],\n];\n\nconst columns: Handsontable.ColumnSettings[] = [\n { data: 0, type: 'text', width: 90 },\n { data: 1, type: 'text', width: 200 },\n { data: 2, type: 'numeric', width: 100 },\n { data: 3, type: 'numeric', width: 95 },\n { data: 4, type: 'text', width: 70 },\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotTableRef = useRef(null);\n\n const getPlugin = () => hotTableRef.current?.hotInstance?.getPlugin('notification');\n\n const onSave = () => {\n getPlugin()?.showMessage({\n title: 'Saved',\n message: 'Inventory updates were written.',\n variant: 'success',\n position: 'top-end',\n duration: 2500,\n });\n };\n\n const onSyncError = () => {\n const plugin = getPlugin();\n\n plugin?.showMessage({\n title: 'Sync failed',\n message: 'The service is unavailable. Retry when your connection is stable.',\n variant: 'error',\n position: 'bottom-end',\n duration: 0,\n actions: [\n {\n label: 'Retry',\n type: 'primary',\n callback: () => {\n plugin.hideAll();\n plugin.showMessage({\n message: 'Sync completed.',\n variant: 'success',\n position: 'bottom-end',\n });\n },\n },\n { label: 'Dismiss', type: 'secondary', callback: () => plugin.hideAll() },\n ],\n });\n };\n\n const onLowStock = () => {\n getPlugin()?.showMessage({\n title: 'Review quantities',\n message:\n 'SKUs below reorder: USB-C cable 1m, Wireless mouse, HDMI cable 2m. Out of stock: Notebook A5 ruled, Laptop stand.',\n variant: 'warning',\n position: 'top-start',\n duration: 6000,\n });\n };\n\n return (\n
\n
\n
\n \n \n \n
\n
\n \n
\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/dialog/notification/react/example2.tsx","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example1.vue.json index 3f6fe1e5a..4c9c96385 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Notification · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/notification/vue/example1.vue","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Notification · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/notification/vue/example1.vue","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/notification","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example2.vue.json index 5d2eb689b..6eccf3e46 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__dialog__notification__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/notification/vue/example2.vue","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"Vue 3"} +{"framework":"vue","displayName":"Dialog ▸ Notification · Toolbar actions (inventory-style) · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/dialog/notification/vue/example2.vue","breadcrumb":["Dialog","Notification"],"guide":"guides/dialog/notification/notification.md","guideTitle":"Notification","exampleId":"example2","exampleTitle":"Toolbar actions (inventory-style)","docPermalink":"/notification","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example1.ts.json index 66b0c684c..9aaeabea9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula builder · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example1.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula builder · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example1.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example2.ts.json index 7c68bccfa..063938978 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example2.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example2.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example3.ts.json index d8f898076..f79eda7dc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example3-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula', readOnly: true },\n ],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example3.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example3-formula-builder',\n template: `\n
\n \n
\n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula', readOnly: true },\n ],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig },\n ],\n};"},"docsPath":"guides/formulas/formula-builder/angular/example3.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.js.json index 7195f44f4..b10d8ec5f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example1.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example1.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.ts.json index 2819e6fce..01a05c998 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example1.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Q1 2025', 'Q2 2025', 'Q3 2025', 'Total', 'Share'],\n rowHeaders: true,\n height: 342,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example1.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.js.json index f05faa724..f31ecdc69 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example2.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example2.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.ts.json index adb6d0fcf..604662b0a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example2.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Impressions', 'Conversions', 'Rate'],\n rowHeaders: true,\n height: 296,\n editor: 'formula',\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n popups: {\n showClose: true,\n suggestions: {\n showKeyboardHelp: false,\n showNamedExpressions: false,\n },\n },\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example2.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.js.json index 4301e162d..ee72c4b15 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [{ editor: 'formula' }, { editor: 'formula' }, { editor: 'formula' }, { editor: 'formula', readOnly: true }],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example3.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [{ editor: 'formula' }, { editor: 'formula' }, { editor: 'formula' }, { editor: 'formula', readOnly: true }],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-builder/javascript/example3.js","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.ts.json index a93f93bb7..b590fc838 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula', readOnly: true },\n ],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example3.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Stock 2025', 'Stock 2024', 'Change'],\n rowHeaders: true,\n height: 296,\n columns: [\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula' },\n { editor: 'formula', readOnly: true },\n ],\n formulas: {\n engine: HyperFormula,\n },\n formulaBuilder: {\n builder: formulaBuilder,\n showFormulaBar: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-builder/javascript/example3.ts","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example1.tsx.json index f51be9f36..ea5696774 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula builder · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example1.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula builder · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['Acme Corp', 1250, 1480, 1310, '=SUM(B1:D1)', '=E1/$E$7'],\n ['Vertex Industries', 890, 940, 1020, '=SUM(B2:D2)', '=E2/$E$7'],\n ['Harbor Goods', 640, 580, 710, '=SUM(B3:D3)', '=E3/$E$7'],\n ['Alpine Supply Co.', 1120, 1060, 990, '=SUM(B4:D4)', '=E4/$E$7'],\n ['Nimbus Software', 1540, 1620, 1735, '=SUM(B5:D5)', '=E5/$E$7'],\n ['Quill Media', 430, 510, 480, '=SUM(B6:D6)', '=E6/$E$7'],\n ['All companies', '=SUM(B1:B6)', '=SUM(C1:C6)', '=SUM(D1:D6)', '=SUM(E1:E6)', '=SUM(F1:F6)'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example1.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example2.tsx.json index b5f4d973d..025280139 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example2.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['Spring Sale 2025', 18200, 640, '=C1/B1'],\n ['Brand Awareness Q3', 45100, 1490, '=C2/B2'],\n ['Product Launch', 9800, 410, '=C3/B3'],\n ['Newsletter Reactivation', 12600, 505, '=C4/B4'],\n ['All campaigns', '=SUM(B1:B4)', '=SUM(C1:C4)', '=C5/B5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example2.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example3.tsx.json index c06045c73..d33a47261 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example3.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport * as formulaBuilder from 'hyperformula-ui';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Declared outside the component: the wrapper compares `data` by identity, so a new array on\n// every render would replace the grid's data, the user's edits included.\nconst data: (string | number)[][] = [\n ['SKU-4821', 142, 96, '=(B1-C1)/C1'],\n ['SKU-0093', 67, 88, '=(B2-C2)/C2'],\n ['SKU-3310', 205, 0, '=(B3-C3)/C3'],\n ['SKU-1275', 58, 41, '=(B4-C4)/C4'],\n ['SKU-9004', 310, 264, '=(B5-C5)/C5'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-builder/react/example3.tsx","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example1.vue.json index 3b175b3bb..fba6d19f2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula builder · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example1.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula builder · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example1.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-builder","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example2.vue.json index d3fb98f2e..767fb1e3d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example2.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula builder · Autocomplete and popups · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example2.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example2","exampleTitle":"Autocomplete and popups","docPermalink":"/formula-builder","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example3.vue.json index 1b0f3183d..db969355a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-builder__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example3.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula builder · Error indicators and read-only cells · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\",\n \"hyperformula-ui\": \"0.3.6\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-builder/vue/example3.vue","breadcrumb":["Formulas","Formula builder"],"guide":"guides/formulas/formula-builder/formula-builder.md","guideTitle":"Formula builder","exampleId":"example3","exampleTitle":"Error indicators and read-only cells","docPermalink":"/formula-builder","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-custom-functions.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-custom-functions.ts.json index 41fd4e594..8b322127a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-custom-functions.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-custom-functions.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example-custom-functions',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: { engine: HyperFormula },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example-custom-functions.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example-custom-functions',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: { engine: HyperFormula },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example-custom-functions.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-hyperlinks.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-hyperlinks.ts.json index f2fc8ac2e..fa3e09a68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-hyperlinks.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example-hyperlinks.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example-hyperlinks',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: { engine: HyperFormula, hyperlinks: true },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example-hyperlinks.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example-hyperlinks',\n template: `\n \n `,\n})\nexport class AppComponent {\n readonly data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: { engine: HyperFormula, hyperlinks: true },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example-hyperlinks.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example1.ts.json index 672af9416..23b92b314 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n selector: 'app-example1',\n template: `\n

Sheet 1

\n \n \n\n

Sheet 2

\n \n \n `,\n styles: `\n h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n // create an external HyperFormula instance\n readonly hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n readonly hotData1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n ];\n\n readonly hotSettings1: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n readonly hotData2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n ];\n\n readonly hotSettings2: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n selector: 'app-example1',\n template: `\n

Sheet 1

\n \n \n\n

Sheet 2

\n \n \n `,\n styles: `\n h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n }\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n // create an external HyperFormula instance\n readonly hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n readonly hotData1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n ];\n\n readonly hotSettings1: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n readonly hotData2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n ];\n\n readonly hotSettings2: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: this.hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example2.ts.json index 46aec6095..bf97572ca 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Data grid example (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n [\n '=SUM(A1:A100)',\n '=AVERAGE(B1:B100)',\n '=AVERAGE(C1:C100)',\n '=SUM(D1:D100)',\n '=SUM(E1:E100)',\n ],\n ];\n\n readonly hotSettings: GridSettings = {\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example2.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example2","exampleTitle":"Data grid example (2)","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Data grid example (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n [\n '=SUM(A1:A100)',\n '=AVERAGE(B1:B100)',\n '=AVERAGE(C1:C100)',\n '=SUM(D1:D100)',\n '=SUM(E1:E100)',\n ],\n ];\n\n readonly hotSettings: GridSettings = {\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example2.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example2","exampleTitle":"Data grid example (2)","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example3.ts.json index 56fe0578f..4becf6444 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport {FormControl, ReactiveFormsModule} from '@angular/forms';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule, ReactiveFormsModule],\n selector: 'app-example3',\n template: `\n
\n
\n  \n \n
\n {{ errorMessage }}\n
\n\n \n \n `,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n namedExpressionsControl = new FormControl('=10 * Sheet1!$A$2');\n\n errorMessage = '';\n\n readonly hotData = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n applyNamedExpression() {\n const formulasPlugin = this.hotTable.hotInstance!.getPlugin('formulas');\n\n try {\n (formulasPlugin.engine as any)?.changeNamedExpression('ADDITIONAL_COST', this.namedExpressionsControl.value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n this.errorMessage = error instanceof Error ? error.message : String(error);\n\n return;\n }\n\n this.errorMessage = '';\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example3.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example3","exampleTitle":"Demo: plain-value named expression (2)","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport {GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport {FormControl, ReactiveFormsModule} from '@angular/forms';\nimport {HyperFormula} from 'hyperformula';\n\n@Component({\n standalone: true,\n imports: [HotTableModule, ReactiveFormsModule],\n selector: 'app-example3',\n template: `\n
\n
\n  \n \n
\n {{ errorMessage }}\n
\n\n \n \n `,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, {static: false}) hotTable!: HotTableComponent;\n\n namedExpressionsControl = new FormControl('=10 * Sheet1!$A$2');\n\n errorMessage = '';\n\n readonly hotData = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n applyNamedExpression() {\n const formulasPlugin = this.hotTable.hotInstance!.getPlugin('formulas');\n\n try {\n (formulasPlugin.engine as any)?.changeNamedExpression('ADDITIONAL_COST', this.namedExpressionsControl.value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n this.errorMessage = error instanceof Error ? error.message : String(error);\n\n return;\n }\n\n this.errorMessage = '';\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example3.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example3","exampleTitle":"Demo: plain-value named expression (2)","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example4.ts.json index 0b0b97437..790e2db43 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine in the constructor so the sheet is created first.\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n ];\n\n readonly hotSettings: GridSettings;\n\n constructor() {\n const hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n hfInstance.addSheet('Sheet1');\n hfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\n hfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\n this.hotSettings = {\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example4.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example4","exampleTitle":"Demo: formula-based named expressions (2)","docPermalink":"/formula-calculation","lang":"Angular"} +{"framework":"angular","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"hyperformula\": \"3.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HyperFormula } from 'hyperformula';\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine in the constructor so the sheet is created first.\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n readonly hotData = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n ];\n\n readonly hotSettings: GridSettings;\n\n constructor() {\n const hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n hfInstance.addSheet('Sheet1');\n hfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\n hfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\n this.hotSettings = {\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/formulas/formula-calculation/angular/example4.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example4","exampleTitle":"Demo: formula-based named expressions (2)","docPermalink":"/formula-calculation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.js.json index 412c117b7..961337adc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n// Register all Handsontable's modules.\nregisterAllModules();\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast, state) {\n return this.runFunction(ast.args, state, this.metadata('COMMISSION'), (revenue, rate) => revenue * (rate / 100));\n }\n}\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\nconst data = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\nconst container = document.querySelector('#example-custom-functions');\nnew Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-custom-functions.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n// Register all Handsontable's modules.\nregisterAllModules();\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast, state) {\n return this.runFunction(ast.args, state, this.metadata('COMMISSION'), (revenue, rate) => revenue * (rate / 100));\n }\n}\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\nconst data = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\nconst container = document.querySelector('#example-custom-functions');\nnew Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-custom-functions.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.ts.json index fed248d63..9186b4b02 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-custom-functions.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\nconst data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\n\nconst container = document.querySelector('#example-custom-functions')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-custom-functions.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\nconst data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\n\nconst container = document.querySelector('#example-custom-functions')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-custom-functions.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.js.json index 292992cfb..514b2a491 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Data grid example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n];\n\nconst container = document.querySelector('#example-data-grid');\n\nnew Handsontable(container, {\n data,\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-data-grid.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Data grid example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n];\n\nconst container = document.querySelector('#example-data-grid');\n\nnew Handsontable(container, {\n data,\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-data-grid.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.ts.json index 69f9e44cb..d6825317e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-data-grid.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Data grid example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n];\n\nconst container = document.querySelector('#example-data-grid')!;\n\nnew Handsontable(container, {\n data,\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-data-grid.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Data grid example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n];\n\nconst container = document.querySelector('#example-data-grid')!;\n\nnew Handsontable(container, {\n data,\n formulas: {\n engine: HyperFormula,\n },\n colHeaders: ['Qty', 'Unit price', 'Discount', 'Freight', 'Total due (fx)'],\n fixedRowsBottom: 2,\n stretchH: 'all',\n height: 500,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-data-grid.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.js.json index a380bf139..547291f68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst container = document.querySelector('#example-hyperlinks');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: {\n engine: HyperFormula,\n hyperlinks: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-hyperlinks.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst container = document.querySelector('#example-hyperlinks');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: {\n engine: HyperFormula,\n hyperlinks: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-hyperlinks.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.ts.json index 7be21598d..3cb2d2493 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-hyperlinks.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst container = document.querySelector('#example-hyperlinks')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: {\n engine: HyperFormula,\n hyperlinks: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-hyperlinks.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst container = document.querySelector('#example-hyperlinks')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Company', 'Website'],\n rowHeaders: true,\n height: 'auto',\n colWidths: [180, 220],\n formulas: {\n engine: HyperFormula,\n hyperlinks: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-hyperlinks.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.js.json index 5a4a6e3de..65e8faf69 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n \n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n];\n\nconst container = document.querySelector('#example-named-expressions1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst input = document.getElementById('named-expressions-input');\nconst formulasPlugin = hot.getPlugin('formulas');\nconst button = document.getElementById('named-expressions-button');\nconst statusOutput = document.getElementById('named-expressions-status');\n\nbutton.addEventListener('click', () => {\n try {\n formulasPlugin.engine?.changeNamedExpression('ADDITIONAL_COST', input.value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n statusOutput.textContent = error instanceof Error ? error.message : String(error);\n statusOutput.classList.add('is-error');\n\n return;\n }\n\n statusOutput.textContent = '';\n statusOutput.classList.remove('is-error');\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions1.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n \n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n];\n\nconst container = document.querySelector('#example-named-expressions1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst input = document.getElementById('named-expressions-input');\nconst formulasPlugin = hot.getPlugin('formulas');\nconst button = document.getElementById('named-expressions-button');\nconst statusOutput = document.getElementById('named-expressions-status');\n\nbutton.addEventListener('click', () => {\n try {\n formulasPlugin.engine?.changeNamedExpression('ADDITIONAL_COST', input.value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n statusOutput.textContent = error instanceof Error ? error.message : String(error);\n statusOutput.classList.add('is-error');\n\n return;\n }\n\n statusOutput.textContent = '';\n statusOutput.classList.remove('is-error');\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions1.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.ts.json index b571be9ae..a44b96814 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n \n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport { Formulas } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n];\n\nconst container = document.querySelector('#example-named-expressions1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst input = document.getElementById('named-expressions-input')!;\nconst formulasPlugin: Formulas = hot.getPlugin('formulas');\nconst button = document.getElementById('named-expressions-button')!;\nconst statusOutput = document.getElementById('named-expressions-status')!;\n\nbutton!.addEventListener('click', () => {\n try {\n formulasPlugin.engine?.changeNamedExpression('ADDITIONAL_COST', (input as HTMLInputElement).value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n statusOutput.textContent = error instanceof Error ? error.message : String(error);\n statusOutput.classList.add('is-error');\n\n return;\n }\n\n statusOutput.textContent = '';\n statusOutput.classList.remove('is-error');\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n \n \n
\n \n
\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\nimport { Formulas } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n];\n\nconst container = document.querySelector('#example-named-expressions1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: HyperFormula,\n namedExpressions: [\n {\n name: 'ADDITIONAL_COST',\n expression: 100,\n },\n ],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst input = document.getElementById('named-expressions-input')!;\nconst formulasPlugin: Formulas = hot.getPlugin('formulas');\nconst button = document.getElementById('named-expressions-button')!;\nconst statusOutput = document.getElementById('named-expressions-status')!;\n\nbutton!.addEventListener('click', () => {\n try {\n formulasPlugin.engine?.changeNamedExpression('ADDITIONAL_COST', (input as HTMLInputElement).value);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n statusOutput.textContent = error instanceof Error ? error.message : String(error);\n statusOutput.classList.add('is-error');\n\n return;\n }\n\n statusOutput.textContent = '';\n statusOutput.classList.remove('is-error');\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.js.json index 3de2aa321..947fe3c22 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine, add the sheet, then add the named expressions.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst container = document.querySelector('#example-named-expressions2');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions2.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine, add the sheet, then add the named expressions.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst container = document.querySelector('#example-named-expressions2');\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions2.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.ts.json index c7f281997..263cb7415 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example-named-expressions2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine, add the sheet, then add the named expressions.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data: (string | number)[][] = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst container = document.querySelector('#example-named-expressions2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions2.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine, add the sheet, then add the named expressions.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data: (string | number)[][] = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst container = document.querySelector('#example-named-expressions2')!;\n\nnew Handsontable(container, {\n data,\n colHeaders: ['Product', 'Q1 Sales', 'Q2 Sales'],\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hfInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/formulas/formula-calculation/javascript/example-named-expressions2.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.js.json index bf2ac520e..d5fa0f2f0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

Sheet 1

\n
\n

Sheet 2

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n];\n\nconst data2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container1 = document.querySelector('#example-basic-multi-sheet-1');\n\nnew Handsontable(container1, {\n data: data1,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst container2 = document.querySelector('#example-basic-multi-sheet-2');\n\nnew Handsontable(container2, {\n data: data2,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/javascript/example1.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Formulas ▸ Formula calculation · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

Sheet 1

\n
\n

Sheet 2

\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n];\n\nconst data2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container1 = document.querySelector('#example-basic-multi-sheet-1');\n\nnew Handsontable(container1, {\n data: data1,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst container2 = document.querySelector('#example-basic-multi-sheet-2');\n\nnew Handsontable(container2, {\n data: data2,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/javascript/example1.js","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.ts.json index 243e160ac..2b5d8940d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

Sheet 1

\n
\n

Sheet 2

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data1: [string, null, string, string][] = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n];\n\nconst data2: [string, string][] = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container1 = document.querySelector('#example-basic-multi-sheet-1')!;\n\nnew Handsontable(container1, {\n data: data1,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst container2 = document.querySelector('#example-basic-multi-sheet-2')!;\n\nnew Handsontable(container2, {\n data: data2,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/javascript/example1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Formulas ▸ Formula calculation · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n

Sheet 1

\n
\n

Sheet 2

\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HyperFormula } from 'hyperformula';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data1: [string, null, string, string][] = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n];\n\nconst data2: [string, string][] = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n];\n\n// create an external HyperFormula instance\nconst hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nconst container1 = document.querySelector('#example-basic-multi-sheet-1')!;\n\nnew Handsontable(container1, {\n data: data1,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet1',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst container2 = document.querySelector('#example-basic-multi-sheet-2')!;\n\nnew Handsontable(container2, {\n data: data2,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n formulas: {\n engine: hyperformulaInstance,\n sheetName: 'Sheet2',\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/javascript/example1.ts","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-custom-functions.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-custom-functions.tsx.json index e04fa1580..53a9b7cf1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-custom-functions.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-custom-functions.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-custom-functions\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\nconst data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-custom-functions.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-custom-functions\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FunctionArgumentType, FunctionPlugin, HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// HyperFormula does not export its parser and interpreter types from the package\n// entry point, so derive them from the inherited `runFunction` signature.\ntype RunFunction = FunctionPlugin['runFunction'];\ntype Ast = Parameters[0][number];\ntype ProcedureAst = Extract;\ntype InterpreterState = Parameters[1];\ntype InterpreterValue = ReturnType[3]>;\n\n// register Handsontable's modules\nregisterAllModules();\n\nclass CommissionPlugin extends FunctionPlugin {\n commission(ast: ProcedureAst, state: InterpreterState): InterpreterValue {\n return this.runFunction(\n ast.args,\n state,\n this.metadata('COMMISSION'),\n (revenue: number, rate: number): number => revenue * (rate / 100),\n );\n }\n}\n\nCommissionPlugin.implementedFunctions = {\n COMMISSION: {\n method: 'commission',\n parameters: [\n { argumentType: FunctionArgumentType.NUMBER },\n { argumentType: FunctionArgumentType.NUMBER },\n ],\n },\n};\n\nHyperFormula.registerFunctionPlugin(CommissionPlugin, {\n enGB: { COMMISSION: 'COMMISSION' },\n});\n\nconst data: (string | number)[][] = [\n ['Sales rep', 'Revenue (USD)', 'Commission rate (%)', 'Commission amount (USD)'],\n ['Ana García', 45000, 8, '=COMMISSION(B2,C2)'],\n ['James Okafor', 62000, 10, '=COMMISSION(B3,C3)'],\n ['Li Wei', 38000, 8, '=COMMISSION(B4,C4)'],\n ['Maria Santos', 71000, 12, '=COMMISSION(B5,C5)'],\n ['David Kim', 29000, 7, '=COMMISSION(B6,C6)'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-custom-functions.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-data-grid.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-data-grid.tsx.json index a3183a9ef..1a5feeec9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-data-grid.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-data-grid.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Data grid example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-data-grid\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-data-grid.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Data grid example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-data-grid\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data = [\n ['150', '643', '0.32', '11', '=A1*(B1*C1)+D1'],\n ['172', '474', '0.51', '11', '=A2*(B2*C2)+D2'],\n ['188', '371', '0.59', '11', '=A3*(B3*C3)+D3'],\n ['162', '731', '0.21', '10', '=A4*(B4*C4)+D4'],\n ['133', '682', '0.81', '9', '=A5*(B5*C5)+D5'],\n ['87', '553', '0.66', '10', '=A6*(B6*C6)+D6'],\n ['26', '592', '0.62', '11', '=A7*(B7*C7)+D7'],\n ['110', '461', '0.73', '9', '=A8*(B8*C8)+D8'],\n ['50', '346', '0.52', '15', '=A9*(B9*C9)+D9'],\n ['160', '423', '0.82', '11', '=A10*(B10*C10)+D10'],\n ['30', '216', '0.26', '9', '=A11*(B11*C11)+D11'],\n ['39', '473', '0.44', '5', '=A12*(B12*C12)+D12'],\n ['96', '490', '0.43', '5', '=A13*(B13*C13)+D13'],\n ['108', '176', '0.71', '7', '=A14*(B14*C14)+D14'],\n ['46', '586', '0.01', '14', '=A15*(B15*C15)+D15'],\n ['97', '514', '0.7', '14', '=A16*(B16*C16)+D16'],\n ['161', '717', '0.01', '13', '=A17*(B17*C17)+D17'],\n ['58', '123', '0.4', '8', '=A18*(B18*C18)+D18'],\n ['92', '739', '0.76', '14', '=A19*(B19*C19)+D19'],\n ['5', '320', '0.52', '13', '=A20*(B20*C20)+D20'],\n ['158', '480', '0.65', '5', '=A21*(B21*C21)+D21'],\n ['121', '373', '0.66', '8', '=A22*(B22*C22)+D22'],\n ['61', '704', '0.95', '7', '=A23*(B23*C23)+D23'],\n ['155', '452', '0.71', '10', '=A24*(B24*C24)+D24'],\n ['162', '693', '0.73', '11', '=A25*(B25*C25)+D25'],\n ['46', '75', '0.14', '15', '=A26*(B26*C26)+D26'],\n ['47', '691', '0.58', '15', '=A27*(B27*C27)+D27'],\n ['104', '346', '0.04', '7', '=A28*(B28*C28)+D28'],\n ['101', '717', '0.87', '5', '=A29*(B29*C29)+D29'],\n ['150', '487', '0.26', '15', '=A30*(B30*C30)+D30'],\n ['42', '465', '0.09', '14', '=A31*(B31*C31)+D31'],\n ['144', '337', '0.72', '7', '=A32*(B32*C32)+D32'],\n ['195', '138', '0.3', '6', '=A33*(B33*C33)+D33'],\n ['199', '717', '0.16', '6', '=A34*(B34*C34)+D34'],\n ['110', '236', '0.91', '9', '=A35*(B35*C35)+D35'],\n ['51', '351', '0.81', '13', '=A36*(B36*C36)+D36'],\n ['69', '221', '0.64', '9', '=A37*(B37*C37)+D37'],\n ['53', '125', '0.28', '12', '=A38*(B38*C38)+D38'],\n ['168', '428', '0.68', '9', '=A39*(B39*C39)+D39'],\n ['58', '361', '0.36', '5', '=A40*(B40*C40)+D40'],\n ['152', '213', '0.13', '13', '=A41*(B41*C41)+D41'],\n ['66', '431', '0.93', '10', '=A42*(B42*C42)+D42'],\n ['112', '108', '0.5', '14', '=A43*(B43*C43)+D43'],\n ['50', '127', '0.7', '7', '=A44*(B44*C44)+D44'],\n ['31', '200', '0.15', '14', '=A45*(B45*C45)+D45'],\n ['132', '654', '0.81', '8', '=A46*(B46*C46)+D46'],\n ['45', '438', '0.79', '6', '=A47*(B47*C47)+D47'],\n ['197', '615', '0.63', '7', '=A48*(B48*C48)+D48'],\n ['190', '592', '0.37', '8', '=A49*(B49*C49)+D49'],\n ['184', '419', '0.78', '8', '=A50*(B50*C50)+D50'],\n ['169', '58', '0.13', '7', '=A51*(B51*C51)+D51'],\n ['152', '324', '0.58', '5', '=A52*(B52*C52)+D52'],\n ['182', '713', '0.53', '5', '=A53*(B53*C53)+D53'],\n ['141', '576', '0.63', '12', '=A54*(B54*C54)+D54'],\n ['169', '429', '0.14', '13', '=A55*(B55*C55)+D55'],\n ['39', '694', '0.98', '13', '=A56*(B56*C56)+D56'],\n ['71', '361', '0.3', '13', '=A57*(B57*C57)+D57'],\n ['148', '540', '0.89', '6', '=A58*(B58*C58)+D58'],\n ['116', '52', '0.3', '7', '=A59*(B59*C59)+D59'],\n ['96', '395', '0.28', '7', '=A60*(B60*C60)+D60'],\n ['35', '222', '0.86', '13', '=A61*(B61*C61)+D61'],\n ['16', '430', '0.8', '8', '=A62*(B62*C62)+D62'],\n ['194', '357', '0.72', '9', '=A63*(B63*C63)+D63'],\n ['24', '498', '0.7', '7', '=A64*(B64*C64)+D64'],\n ['170', '142', '0.52', '5', '=A65*(B65*C65)+D65'],\n ['184', '614', '0.68', '9', '=A66*(B66*C66)+D66'],\n ['153', '524', '0.15', '9', '=A67*(B67*C67)+D67'],\n ['88', '620', '0.39', '15', '=A68*(B68*C68)+D68'],\n ['57', '452', '0.11', '6', '=A69*(B69*C69)+D69'],\n ['62', '493', '0.03', '11', '=A70*(B70*C70)+D70'],\n ['123', '431', '0.75', '15', '=A71*(B71*C71)+D71'],\n ['77', '113', '0.63', '12', '=A72*(B72*C72)+D72'],\n ['199', '208', '0.07', '6', '=A73*(B73*C73)+D73'],\n ['149', '514', '0.42', '12', '=A74*(B74*C74)+D74'],\n ['191', '334', '0.78', '13', '=A75*(B75*C75)+D75'],\n ['150', '643', '0.32', '11', '=A76*(B76*C76)+D76'],\n ['130', '721', '0.62', '5', '=A77*(B77*C77)+D77'],\n ['179', '517', '0.1', '8', '=A78*(B78*C78)+D78'],\n ['98', '31', '0.01', '10', '=A79*(B79*C79)+D79'],\n ['175', '509', '0.7', '11', '=A80*(B80*C80)+D80'],\n ['11', '569', '0.37', '7', '=A81*(B81*C81)+D81'],\n ['184', '630', '0.19', '6', '=A82*(B82*C82)+D82'],\n ['27', '165', '0.51', '13', '=A83*(B83*C83)+D83'],\n ['186', '417', '0.85', '15', '=A84*(B84*C84)+D84'],\n ['20', '741', '0.76', '11', '=A85*(B85*C85)+D85'],\n ['153', '640', '0.28', '6', '=A86*(B86*C86)+D86'],\n ['161', '542', '0.43', '14', '=A87*(B87*C87)+D87'],\n ['98', '344', '0.77', '6', '=A88*(B88*C88)+D88'],\n ['30', '400', '0.71', '13', '=A89*(B89*C89)+D89'],\n ['73', '91', '0.78', '8', '=A90*(B90*C90)+D90'],\n ['158', '72', '0.66', '12', '=A91*(B91*C91)+D91'],\n ['122', '35', '0.32', '15', '=A92*(B92*C92)+D92'],\n ['33', '99', '0.92', '9', '=A93*(B93*C93)+D93'],\n ['107', '538', '0.75', '10', '=A94*(B94*C94)+D94'],\n ['15', '563', '0.32', '6', '=A95*(B95*C95)+D95'],\n ['168', '572', '0.71', '6', '=A96*(B96*C96)+D96'],\n ['135', '217', '0.49', '12', '=A97*(B97*C97)+D97'],\n ['11', '595', '0.03', '13', '=A98*(B98*C98)+D98'],\n ['41', '739', '0.88', '11', '=A99*(B99*C99)+D99'],\n ['144', '289', '0.87', '13', '=A100*(B100*C100)+D100'],\n ['Sum', 'Average', 'Average', 'Sum', 'Sum'],\n ['=SUM(A1:A100)', '=AVERAGE(B1:B100)', '=AVERAGE(C1:C100)', '=SUM(D1:D100)', '=SUM(E1:E100)'],\n ];\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-data-grid.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-hyperlinks.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-hyperlinks.tsx.json index 688b2fbf3..582e67b05 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-hyperlinks.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-hyperlinks.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-hyperlinks\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-hyperlinks.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-hyperlinks\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['Acme Corp', '=HYPERLINK(\"https://example.com/acme\", \"acme.example.com\")'],\n ['Vertex Industries', '=HYPERLINK(\"https://example.com/vertex\", \"vertex.example.com\")'],\n ['Harbor Goods', '=HYPERLINK(\"https://example.com/harbor\", \"harbor.example.com\")'],\n ['Alpine Supply Co.', '=HYPERLINK(\"https://example.com/alpine\", \"alpine.example.com\")'],\n ['Summit Logistics', '=HYPERLINK(\"https://example.com/summit\", \"summit.example.com\")'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-hyperlinks.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions1.tsx.json index 38cd02e59..f02f6e4a2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-named-expressions1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { ChangeEvent, useRef, useState } from 'react';\nimport { HyperFormula } from 'hyperformula';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotNamedExpressionsRef = useRef(null);\n const [namedExpressionValue, setNamedExpressionValue] = useState('=10 * Sheet1!$A$2');\n const [errorMessage, setErrorMessage] = useState('');\n\n const data = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n ];\n\n const inputChangeCallback = (event: ChangeEvent) => {\n setNamedExpressionValue(event.target.value);\n };\n\n const buttonClickCallback = () => {\n const hotNamedExpressions = hotNamedExpressionsRef.current?.hotInstance;\n const formulasPlugin = hotNamedExpressions?.getPlugin('formulas');\n\n try {\n formulasPlugin?.engine?.changeNamedExpression('ADDITIONAL_COST', namedExpressionValue);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n setErrorMessage(error instanceof Error ? error.message : String(error));\n\n return;\n }\n\n setErrorMessage('');\n };\n\n return (\n <>\n
\n
\n inputChangeCallback(...args)}\n />\n \n
\n {errorMessage}\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-named-expressions1.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-named-expressions1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { ChangeEvent, useRef, useState } from 'react';\nimport { HyperFormula } from 'hyperformula';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotNamedExpressionsRef = useRef(null);\n const [namedExpressionValue, setNamedExpressionValue] = useState('=10 * Sheet1!$A$2');\n const [errorMessage, setErrorMessage] = useState('');\n\n const data = [\n ['Travel ID', 'Destination', 'Base price', 'Price with extra cost'],\n ['154', 'Rome', 400, '=ROUND(ADDITIONAL_COST+C2,0)'],\n ['155', 'Athens', 300, '=ROUND(ADDITIONAL_COST+C3,0)'],\n ['156', 'Warsaw', 150, '=ROUND(ADDITIONAL_COST+C4,0)'],\n ];\n\n const inputChangeCallback = (event: ChangeEvent) => {\n setNamedExpressionValue(event.target.value);\n };\n\n const buttonClickCallback = () => {\n const hotNamedExpressions = hotNamedExpressionsRef.current?.hotInstance;\n const formulasPlugin = hotNamedExpressions?.getPlugin('formulas');\n\n try {\n formulasPlugin?.engine?.changeNamedExpression('ADDITIONAL_COST', namedExpressionValue);\n } catch (error) {\n // HyperFormula rejects some expressions, for example relative references such as `Sheet1!A2`.\n setErrorMessage(error instanceof Error ? error.message : String(error));\n\n return;\n }\n\n setErrorMessage('');\n };\n\n return (\n <>\n
\n
\n inputChangeCallback(...args)}\n />\n \n
\n {errorMessage}\n
\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-named-expressions1.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions2.tsx.json index 80aef43a7..124425634 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example-named-expressions2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-named-expressions2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine at module level so it is created only once.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-named-expressions2.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example-named-expressions2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Named expressions that reference cell ranges must be registered after the sheet\n// exists. Pre-build the engine at module level so it is created only once.\nconst hfInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n});\n\nhfInstance.addSheet('Sheet1');\nhfInstance.addNamedExpression('Q1_TOTAL', '=SUM(Sheet1!$B$1:$B$3)');\nhfInstance.addNamedExpression('Q2_TOTAL', '=SUM(Sheet1!$C$1:$C$3)');\n\nconst data = [\n ['Widget A', 200, 250],\n ['Widget B', 150, 300],\n ['Widget C', 400, 350],\n ['Totals', '=Q1_TOTAL', '=Q2_TOTAL'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/formulas/formula-calculation/react/example-named-expressions2.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example1.tsx.json index 4af024455..9379ff984 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Formulas ▸ Formula calculation · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n ];\n\n const data2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n ];\n\n // create an external HyperFormula instance\n const hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n return (\n <>\n

Sheet 1

\n \n

Sheet 2

\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/react/example1.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"React (TS)"} +{"framework":"react","displayName":"Formulas ▸ Formula calculation · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HyperFormula } from 'hyperformula';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data1 = [\n ['10.26', null, 'Sum', '=SUM(A:A)'],\n ['20.12', null, 'Average', '=AVERAGE(A:A)'],\n ['30.01', null, 'Median', '=MEDIAN(A:A)'],\n ['40.29', null, 'MAX', '=MAX(A:A)'],\n ['50.18', null, 'MIN', '=MIN(A1:A5)'],\n ];\n\n const data2 = [\n ['Is A1 in Sheet1 > 10?', '=IF(Sheet1!A1>10,\"TRUE\",\"FALSE\")'],\n ['Is A:A in Sheet > 150?', '=IF(SUM(Sheet1!A:A)>150,\"TRUE\",\"FALSE\")'],\n ['How many blank cells are in the Sheet1?', '=COUNTBLANK(Sheet1!A1:D5)'],\n ['Generate a random number', '=RAND()'],\n ['Number of sheets in this workbook', '=SHEETS()'],\n ];\n\n // create an external HyperFormula instance\n const hyperformulaInstance = HyperFormula.buildEmpty({\n // this demo uses the GPLv3 key,\n // use your own HyperFormula license key in your app\n licenseKey: 'gpl-v3',\n });\n\n return (\n <>\n

Sheet 1

\n \n

Sheet 2

\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/react/example1.tsx","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-custom-functions.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-custom-functions.vue.json index 345221fc6..046ef2473 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-custom-functions.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-custom-functions.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-custom-functions\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-custom-functions.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: custom COMMISSION function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-custom-functions\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-custom-functions.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-custom-functions","exampleTitle":"Demo: custom COMMISSION function","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-data-grid.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-data-grid.vue.json index d0269c57b..2a0c7e725 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-data-grid.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-data-grid.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Data grid example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-data-grid\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-data-grid.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Data grid example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-data-grid\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-data-grid.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-data-grid","exampleTitle":"Data grid example","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-hyperlinks.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-hyperlinks.vue.json index ed1bf7249..3940bbb7e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-hyperlinks.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-hyperlinks.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-hyperlinks\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-hyperlinks.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Render HYPERLINK formulas as links · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-hyperlinks\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-hyperlinks.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-hyperlinks","exampleTitle":"Render HYPERLINK formulas as links","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions1.vue.json index 898280587..a9da4165e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-named-expressions1\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-named-expressions1.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: plain-value named expression · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-named-expressions1\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-named-expressions1.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions1","exampleTitle":"Demo: plain-value named expression","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions2.vue.json index f6d6183d1..7f96bab0e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example-named-expressions2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-named-expressions2\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-named-expressions2.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Demo: formula-based named expressions · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example-named-expressions2\");","/src/App.vue":"\n\n"},"docsPath":"guides/formulas/formula-calculation/vue/example-named-expressions2.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example-named-expressions2","exampleTitle":"Demo: formula-based named expressions","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example1.vue.json index 06df335c6..269c509ff 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__formulas__formula-calculation__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/vue/example1.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"Vue 3"} +{"framework":"vue","displayName":"Formulas ▸ Formula calculation · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"hyperformula\": \"3.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":"h3.demo-preview {\n margin-bottom: 0.3rem !important;\n padding-top: 0 !important;\n margin-top: 0.5rem !important;\n}"},"docsPath":"guides/formulas/formula-calculation/vue/example1.vue","breadcrumb":["Formulas","Formula calculation"],"guide":"guides/formulas/formula-calculation/formula-calculation.md","guideTitle":"Formula calculation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/formula-calculation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__angular-hot-instance__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__angular-hot-instance__angular__example1.ts.json index 152fa6381..633779dca 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__angular-hot-instance__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__angular-hot-instance__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Instance access · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-instance-access',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: true }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', '142'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', '0'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', '67'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', '215'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n selectCell(): void {\n // The Handsontable instance is stored under the `hotInstance` property of the wrapper component.\n this.hotTable?.hotInstance?.selectCell(1, 1);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/angular-hot-instance/angular/example1.ts","breadcrumb":["Getting Started","Instance access"],"guide":"guides/getting-started/angular-hot-instance/angular-hot-instance.md","guideTitle":"Instance access","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/instance-access","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Instance access · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-instance-access',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n
\n
\n \n
`,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: true }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', '142'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', '0'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', '67'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', '215'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n selectCell(): void {\n // The Handsontable instance is stored under the `hotInstance` property of the wrapper component.\n this.hotTable?.hotInstance?.selectCell(1, 1);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/angular-hot-instance/angular/example1.ts","breadcrumb":["Getting Started","Instance access"],"guide":"guides/getting-started/angular-hot-instance/angular-hot-instance.md","guideTitle":"Instance access","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/instance-access","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example1.ts.json index ce504c08c..17fcbf39b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n startRows: 5,\n startCols: 5,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example1.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n startRows: 5,\n startCols: 5,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example1.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example10.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example10.ts.json index c2e3e6f9f..2d3041239 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example10.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example10.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example10-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n this.hotTable?.hotInstance?.setDataAtCell(0, 4, 'Denver');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example10.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example10-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n this.hotTable?.hotInstance?.setDataAtCell(0, 4, 'Denver');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example10.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example11.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example11.ts.json index ee666e7ca..ae19d89c1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example11.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example11.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example11-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n readonly dataAfterClone = structuredClone(this.data);\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example11.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example11-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n readonly dataAfterClone = structuredClone(this.data);\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example11.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example2.ts.json index b9eb2586b..c51838998 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example2.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example2.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example3.ts.json index 4e3befef0..053cba08c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\n@Component({\n selector: 'example3-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example3.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\n@Component({\n selector: 'example3-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example3.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example4.ts.json index c31573ce1..d520e31bf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\n@Component({\n selector: 'example4-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: (columnIndex: number) => {\n switch (columnIndex) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example4.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\n@Component({\n selector: 'example4-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: (columnIndex: number) => {\n switch (columnIndex) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example4.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example5.ts.json index 60d1177cf..70cd95a99 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\n@Component({\n selector: 'example5-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'address' },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example5.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\n@Component({\n selector: 'example5-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'address' },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example5.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example6.ts.json index aba4b9b85..95f3bcc78 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [];\n readonly gridSettings: GridSettings = {\n dataSchema: {\n id: null,\n name: {\n first: null,\n last: null,\n },\n address: null,\n },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'address' },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example6.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example6-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [];\n readonly gridSettings: GridSettings = {\n dataSchema: {\n id: null,\n name: {\n first: null,\n last: null,\n },\n address: null,\n },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 'id' },\n { data: 'name.first' },\n { data: 'name.last' },\n { data: 'address' },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example6.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example7.ts.json index 1fa5c8dbc..ed68fdea8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example7.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Function data source and schema · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, Type } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\ninterface ModelOptions {\n [x: string]: any;\n id?: number;\n name?: string;\n address?: string;\n hasOwnProperty?: (prop: string) => boolean;\n}\n\ntype PrivPerson = {\n [K in keyof Person]: Person[K];\n} & { [key: string]: any };\n\nfunction model(opts: ModelOptions): Partial {\n const _pub: Partial = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: undefined,\n };\n\n const _priv: Partial = {};\n\n for (const i in opts) {\n if (opts.hasOwnProperty && opts.hasOwnProperty(i)) {\n _priv[i] = opts[i];\n }\n }\n\n _pub.attr = function (\n attr: keyof Person | string,\n val?: Handsontable.CellValue\n ) {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: keyof Person | string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) =>\n (row as unknown as Person).attr(attr, value);\n}\n\n@Component({\n selector: 'example7-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ];\n\n readonly gridSettings: GridSettings = {\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [\n { data: property('id') },\n { data: property('name') },\n { data: property('address') },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example7.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · Function data source and schema · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, Type } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\ninterface ModelOptions {\n [x: string]: any;\n id?: number;\n name?: string;\n address?: string;\n hasOwnProperty?: (prop: string) => boolean;\n}\n\ntype PrivPerson = {\n [K in keyof Person]: Person[K];\n} & { [key: string]: any };\n\nfunction model(opts: ModelOptions): Partial {\n const _pub: Partial = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: undefined,\n };\n\n const _priv: Partial = {};\n\n for (const i in opts) {\n if (opts.hasOwnProperty && opts.hasOwnProperty(i)) {\n _priv[i] = opts[i];\n }\n }\n\n _pub.attr = function (\n attr: keyof Person | string,\n val?: Handsontable.CellValue\n ) {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: keyof Person | string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) =>\n (row as unknown as Person).attr(attr, value);\n}\n\n@Component({\n selector: 'example7-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly data = [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ];\n\n readonly gridSettings: GridSettings = {\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [\n { data: property('id') },\n { data: property('name') },\n { data: property('address') },\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example7.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example9.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example9.ts.json index 8e801a394..c0dbe7caf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example9.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__angular__example9.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Binding to data · No data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example9-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example9.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Binding to data · No data · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example9-binding-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/binding-to-data/angular/example9.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.js.json index fef6f1df8..556f1d013 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n startRows: 5,\n startCols: 5,\n height: 'auto',\n width: 'auto',\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example1.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n startRows: 5,\n startCols: 5,\n height: 'auto',\n width: 'auto',\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example1.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.ts.json index b55c72c19..602920c14 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n startRows: 5,\n startCols: 5,\n height: 'auto',\n width: 'auto',\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example1.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n startRows: 5,\n startCols: 5,\n height: 'auto',\n width: 'auto',\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example1.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.js.json index ce39981e4..c2684ab4a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst settings = {\n data,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hot = new Handsontable(container, settings);\n\nhot.setDataAtCell(0, 4, 'Denver');","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example10.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst settings = {\n data,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hot = new Handsontable(container, settings);\n\nhot.setDataAtCell(0, 4, 'Denver');","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example10.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.ts.json index d7f11c32d..266feeba0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example10.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst settings = {\n data,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hot = new Handsontable(container, settings);\n\nhot.setDataAtCell(0, 4, 'Denver');","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example10.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example10')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst settings = {\n data,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst hot = new Handsontable(container, settings);\n\nhot.setDataAtCell(0, 4, 'Denver');","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example10.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.js.json index 91bafcff7..492829109 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example11');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data: structuredClone(data),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example11.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example11');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data: structuredClone(data),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example11.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.ts.json index 4338949bc..55b3acee1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example11.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example11')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data: structuredClone(data),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example11.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example11')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data: structuredClone(data),\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example11.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.js.json index ca9457b7f..2847cde92 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example2.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example2.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.ts.json index b7a566e6f..ab44cb098 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example2.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n height: 'auto',\n width: 'auto',\n columns: [\n { data: 0 },\n { data: 1 },\n // skip the third column\n { data: 3 },\n { data: 4 },\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example2.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.js.json index fb3e197e2..ae4ac9c50 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst data = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example3.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\nconst data = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example3.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.ts.json index 3497abcb1..1d7b2657a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example3.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example3.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.js.json index 6571ad760..d4a562a9d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst data = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' },\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns(column) {\n switch (column) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example4.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\nconst data = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' },\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns(column) {\n switch (column) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example4.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.ts.json index 3db6b6d47..a6abe24fd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns(column) {\n switch (column) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example4.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns(column) {\n switch (column) {\n case 0:\n return { data: 'id' };\n case 1:\n return { data: 'name.first' };\n case 2:\n return { data: 'name.last' };\n case 3:\n return { data: 'address' };\n default:\n return {};\n }\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example4.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.js.json index 0dd2aec7c..a69626424 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst data = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' },\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example5.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\nconst data = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' },\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example5.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.ts.json index f920b403b..af359e597 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example5.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: true,\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example5.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.js.json index 0f7f51114..c55cae5d1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n data: [],\n dataSchema: { id: null, name: { first: null, last: null }, address: null },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example6.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6');\n\nnew Handsontable(container, {\n data: [],\n dataSchema: { id: null, name: { first: null, last: null }, address: null },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example6.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.ts.json index ec7a02fc8..577c5d99a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data: [],\n dataSchema: { id: null, name: { first: null, last: null }, address: null },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example6.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n data: [],\n dataSchema: { id: null, name: { first: null, last: null }, address: null },\n startRows: 5,\n startCols: 4,\n colHeaders: ['ID', 'First Name', 'Last Name', 'Address'],\n height: 'auto',\n width: 'auto',\n columns: [{ data: 'id' }, { data: 'name.first' }, { data: 'name.last' }, { data: 'address' }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example6.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.js.json index d449b7837..71178b8dd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Function data source and schema · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7');\n\nnew Handsontable(container, {\n data: [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ],\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [{ data: property('id') }, { data: property('name') }, { data: property('address') }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction model(person) {\n const _pub = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: () => _pub,\n };\n\n const _priv = {};\n\n for (const prop in person) {\n if (person.hasOwnProperty(prop)) {\n _priv[prop] = person[prop];\n }\n }\n\n _pub.attr = (attr, val) => {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr) {\n return (row, value) => row.attr(attr, value);\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example7.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · Function data source and schema · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example7');\n\nnew Handsontable(container, {\n data: [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ],\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [{ data: property('id') }, { data: property('name') }, { data: property('address') }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction model(person) {\n const _pub = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: () => _pub,\n };\n\n const _priv = {};\n\n for (const prop in person) {\n if (person.hasOwnProperty(prop)) {\n _priv[prop] = person[prop];\n }\n }\n\n _pub.attr = (attr, val) => {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr) {\n return (row, value) => row.attr(attr, value);\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example7.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.ts.json index 658abc17f..b0a807b57 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example7.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Function data source and schema · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\nconst container = document.querySelector('#example7')!;\n\nnew Handsontable(container, {\n data: [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ],\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [{ data: property('id') }, { data: property('name') }, { data: property('address') }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction model(person: Partial) {\n const _pub: Person = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: () => _pub,\n };\n\n const _priv: Partial = {};\n\n for (const prop in person) {\n if (person.hasOwnProperty(prop)) {\n _priv[prop] = person[prop];\n }\n }\n\n _pub.attr = (attr, val) => {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) => (row as unknown as Person).attr(attr, value);\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example7.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · Function data source and schema · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\nconst container = document.querySelector('#example7')!;\n\nnew Handsontable(container, {\n data: [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n ],\n dataSchema: model,\n height: 'auto',\n width: 'auto',\n colHeaders: ['ID', 'Name', 'Address'],\n columns: [{ data: property('id') }, { data: property('name') }, { data: property('address') }],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction model(person: Partial) {\n const _pub: Person = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: () => _pub,\n };\n\n const _priv: Partial = {};\n\n for (const prop in person) {\n if (person.hasOwnProperty(prop)) {\n _priv[prop] = person[prop];\n }\n }\n\n _pub.attr = (attr, val) => {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) => (row as unknown as Person).attr(attr, value);\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example7.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.js.json index 86ec16247..90a0c24e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · No data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example9');\n\nnew Handsontable(container, {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example9.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Binding to data · No data · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example9');\n\nnew Handsontable(container, {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example9.js","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.ts.json index 5d19a11bf..e13183090 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__javascript__example9.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · No data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example9')!;\n\nnew Handsontable(container, {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example9.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Binding to data · No data · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example9')!;\n\nnew Handsontable(container, {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/binding-to-data/javascript/example9.ts","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example1.tsx.json index b6feb128a..e8549ba75 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example1.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example1.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example10.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example10.tsx.json index afa826252..6a1791432 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example10.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example10.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example10\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef, FC } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (hot) {\n hot.setDataAtCell(0, 4, 'Denver');\n }\n }, []); // run once\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example10.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example10\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef, FC } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => {\n const hotRef = useRef(null);\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (hot) {\n hot.setDataAtCell(0, 4, 'Denver');\n }\n }, []); // run once\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example10.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example11.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example11.tsx.json index a3e7c9559..54f7eefb2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example11.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example11.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example11\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst clonedData = structuredClone(data);\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example11.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example11\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst clonedData = structuredClone(data);\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example11.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example2.tsx.json index 0b068cdd4..26232c7be 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example2.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example2.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example3.tsx.json index 701b93d17..7e8c4b8e3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example3.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name: string;\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: 'Ted Right', address: '' },\n { id: 2, name: 'Frank Honest', address: '' },\n { id: 3, name: 'Joan Well', address: '' },\n { id: 4, name: 'Gail Polite', address: '' },\n { id: 5, name: 'Michael Fair', address: '' },\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example3.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example4.tsx.json index c3b8dfac1..88e5a4c1f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst ExampleComponent: FC = () => {\n const data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n return (\n {\n let columnMeta = {};\n\n if (column === 0) {\n columnMeta.data = 'id';\n } else if (column === 1) {\n columnMeta.data = 'name.first';\n } else if (column === 2) {\n columnMeta.data = 'name.last';\n } else if (column === 3) {\n columnMeta.data = 'address';\n } else {\n columnMeta = {};\n }\n\n return columnMeta;\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example4.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst ExampleComponent: FC = () => {\n const data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n ];\n\n return (\n {\n let columnMeta = {};\n\n if (column === 0) {\n columnMeta.data = 'id';\n } else if (column === 1) {\n columnMeta.data = 'name.first';\n } else if (column === 2) {\n columnMeta.data = 'name.last';\n } else if (column === 3) {\n columnMeta.data = 'address';\n } else {\n columnMeta = {};\n }\n\n return columnMeta;\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example4.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example5.tsx.json index c3a5b543c..002688a7a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example5.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface Person {\n id: number;\n name?: { first: string; last: string };\n address: string;\n}\n\nconst data: Person[] = [\n { id: 1, name: { first: 'Ted', last: 'Right' }, address: '' },\n { id: 2, address: '' }, // Handsontable will create missing properties on demand\n { id: 3, name: { first: 'Joan', last: 'Well' }, address: '' },\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example5.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example6.tsx.json index d1d597e4b..2d89ce127 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example6.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example6.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example7.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example7.tsx.json index 2dedc74a7..c1ffc759e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example7.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example7.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · Function data source and schema · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface ModelOptions {\n [x: string]: any;\n id?: number;\n name?: string;\n address?: string;\n hasOwnProperty?: (prop: string) => boolean;\n}\n\ntype PrivPerson = {\n [K in keyof Person]: Person[K];\n} & { [key: string]: any };\n\nfunction model(opts: ModelOptions): Partial {\n const _pub: Partial = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: undefined,\n };\n\n const _priv: Partial = {};\n\n for (const i in opts) {\n if (opts.hasOwnProperty && opts.hasOwnProperty(i)) {\n _priv[i] = opts[i];\n }\n }\n\n _pub.attr = function (attr: keyof Person | string, val?: Handsontable.CellValue) {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: keyof Person | string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) => (row as unknown as Person).attr(attr, value);\n}\n\nconst data: Partial[] = [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example7.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · Function data source and schema · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example7\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\ninterface Person {\n id: number | undefined;\n name: string | undefined;\n address: string | undefined;\n attr: (attr: string, val?: Handsontable.CellValue) => keyof Person | Person;\n}\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface ModelOptions {\n [x: string]: any;\n id?: number;\n name?: string;\n address?: string;\n hasOwnProperty?: (prop: string) => boolean;\n}\n\ntype PrivPerson = {\n [K in keyof Person]: Person[K];\n} & { [key: string]: any };\n\nfunction model(opts: ModelOptions): Partial {\n const _pub: Partial = {\n id: undefined,\n name: undefined,\n address: undefined,\n attr: undefined,\n };\n\n const _priv: Partial = {};\n\n for (const i in opts) {\n if (opts.hasOwnProperty && opts.hasOwnProperty(i)) {\n _priv[i] = opts[i];\n }\n }\n\n _pub.attr = function (attr: keyof Person | string, val?: Handsontable.CellValue) {\n if (typeof val === 'undefined') {\n window.console && console.log('GET the', attr, 'value of', _pub);\n\n return _priv[attr];\n }\n\n window.console && console.log('SET the', attr, 'value of', _pub);\n _priv[attr] = val;\n\n return _pub;\n };\n\n return _pub;\n}\n\nfunction property(attr: keyof Person | string) {\n return (row: Handsontable.RowObject | Handsontable.CellValue[], value?: Handsontable.CellValue) => (row as unknown as Person).attr(attr, value);\n}\n\nconst data: Partial[] = [\n model({ id: 1, name: 'Ted Right', address: '' }),\n model({ id: 2, name: 'Frank Honest', address: '' }),\n model({ id: 3, name: 'Joan Well', address: '' }),\n model({ id: 4, name: 'Gail Polite', address: '' }),\n model({ id: 5, name: 'Michael Fair', address: '' }),\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example7.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example9.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example9.tsx.json index 01673330d..2170c191c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example9.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__react__example9.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Binding to data · No data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example9\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example9.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Binding to data · No data · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example9\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/binding-to-data/react/example9.tsx","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example1.vue.json index 7a9b5bbf7..5f6673faf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example1.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example1.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example10.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example10.vue.json index 6401c8f75..04b9f834b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example10.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example10.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example10\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example10.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Understand binding as a reference · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example10\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example10.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example10","exampleTitle":"Understand binding as a reference","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example11.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example11.vue.json index 17803bf88..19429ec6a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example11.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example11.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example11\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example11.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Working with a copy of data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example11\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example11.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example11","exampleTitle":"Working with a copy of data","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example2.vue.json index db7a9996b..5eb19421c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example2.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of arrays with a selective display of columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example2.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example2","exampleTitle":"Array of arrays with a selective display of columns","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example3.vue.json index 8bcb7dee3..468173b05 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example3.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example3.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example3","exampleTitle":"Array of objects","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example4.vue.json index 5084bc1c9..822f88449 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example4.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with column as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example4.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example4","exampleTitle":"Array of objects with column as a function","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example5.vue.json index d0b9de858..2c3a2bb3a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example5.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with column mapping · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example5.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example5","exampleTitle":"Array of objects with column mapping","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example6.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example6.vue.json index 4c779ab33..f61955b7f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example6.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example6.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example6.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Array of objects with custom data schema · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example6\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example6.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example6","exampleTitle":"Array of objects with custom data schema","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example7.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example7.vue.json index 5aa056961..cd208a2fb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example7.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example7.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Function data source and schema · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example7.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · Function data source and schema · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example7\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example7.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example7","exampleTitle":"Function data source and schema","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example9.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example9.vue.json index 5da5521c3..121ad1ef4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example9.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__binding-to-data__vue__example9.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Binding to data · No data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example9\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example9.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Binding to data · No data · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example9\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/binding-to-data/vue/example9.vue","breadcrumb":["Getting Started","Binding to data"],"guide":"guides/getting-started/binding-to-data/binding-to-data.md","guideTitle":"Binding to data","exampleId":"example9","exampleTitle":"No data","docPermalink":"/binding-to-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__angular__example1.ts.json index a56ddb4f9..c223d1a48 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-custom-id',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/custom-id-class-style/angular/example1.ts","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-custom-id',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent {\n readonly data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/custom-id-class-style/angular/example1.ts","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.js.json index 89d83efa6..023c86b6e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\n// apply a custom class and inline style to the container element\ncontainer.classList.add('inventory-grid');\ncontainer.style.border = '1px solid #4caf50';\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/custom-id-class-style/javascript/example1.js","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst container = document.querySelector('#example1');\n// apply a custom class and inline style to the container element\ncontainer.classList.add('inventory-grid');\ncontainer.style.border = '1px solid #4caf50';\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/custom-id-class-style/javascript/example1.js","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.ts.json index 529201859..a820b0abd 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\n// apply a custom class and inline style to the container element\ncontainer.classList.add('inventory-grid');\ncontainer.style.border = '1px solid #4caf50';\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/custom-id-class-style/javascript/example1.ts","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\n// apply a custom class and inline style to the container element\ncontainer.classList.add('inventory-grid');\ncontainer.style.border = '1px solid #4caf50';\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\n\nnew Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Stock', 'Category'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/custom-id-class-style/javascript/example1.ts","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__react__example1.tsx.json index 794468847..2b6dab04b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/custom-id-class-style/react/example1.tsx","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 142, 'Electronics'],\n ['SKU-0093', 'USB-C Cable', 67, 'Electronics'],\n ['SKU-1175', 'Desk Lamp', 0, 'Home Office'],\n ['SKU-3340', 'Notebook', 230, 'Stationery'],\n ['SKU-7782', 'Standing Desk', 18, 'Furniture'],\n];\n\nconst ExampleComponent: FC = () => (\n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/custom-id-class-style/react/example1.tsx","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__vue__example1.vue.json index 649816167..bccc63413 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__custom-id-class-style__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/custom-id-class-style/vue/example1.vue","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Custom ID, class, and style · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/custom-id-class-style/vue/example1.vue","breadcrumb":["Getting Started","Custom ID, class, and style"],"guide":"guides/getting-started/custom-id-class-style/custom-id-class-style.md","guideTitle":"Custom ID, class, and style","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-id-class-style","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__angular__example1.ts.json index c532e6dc5..808564388 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Demo · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport { CellProperties } from 'handsontable/settings';\nimport { PredefinedMenuItemKey } from 'handsontable/plugins/contextMenu';\n\n// constants.ts\nexport const data = [\n [\n false,\n 'Tagcat',\n 'United Kingdom',\n 'Classic Vest',\n '2025-10-11',\n '01-2331942',\n true,\n '172',\n 2,\n 2,\n ],\n [\n true,\n 'Zoomzone',\n 'Indonesia',\n 'Cycling Cap',\n '2025-05-03',\n '88-2768633',\n true,\n '188',\n 6,\n 2,\n ],\n [\n true,\n 'Meeveo',\n 'United States',\n 'Full-Finger Gloves',\n '2025-03-27',\n '51-6775945',\n true,\n '162',\n 1,\n 3,\n ],\n [\n false,\n 'Buzzdog',\n 'Philippines',\n 'HL Mountain Frame',\n '2025-08-29',\n '44-4028109',\n true,\n '133',\n 7,\n 1,\n ],\n [\n true,\n 'Katz',\n 'India',\n 'Half-Finger Gloves',\n '2025-10-02',\n '08-2758492',\n true,\n '87',\n 1,\n 3,\n ],\n [\n false,\n 'Jaxbean',\n 'China',\n 'HL Road Frame',\n '2025-09-28',\n '84-3557705',\n false,\n '26',\n 8,\n 1,\n ],\n [\n false,\n 'Wikido',\n 'Brazil',\n 'HL Touring Frame',\n '2025-06-24',\n '20-9397637',\n false,\n '110',\n 4,\n 1,\n ],\n [\n false,\n 'Browsedrive',\n 'United States',\n 'LL Mountain Frame',\n '2025-03-13',\n '36-0079556',\n true,\n '50',\n 4,\n 4,\n ],\n [\n false,\n 'Twinder',\n 'United Kingdom',\n 'LL Road Frame',\n '2025-04-06',\n '41-1489542',\n false,\n '160',\n 6,\n 1,\n ],\n [\n false,\n 'Jetwire',\n 'China',\n 'LL Touring Frame',\n '2025-02-01',\n '37-1531629',\n true,\n '30',\n 8,\n 5,\n ],\n [\n false,\n 'Chatterpoint',\n 'China',\n 'Long-Sleeve Logo Jersey',\n '2025-07-14',\n '25-5083429',\n true,\n '39',\n 7,\n 2,\n ],\n [\n false,\n 'Twinder',\n 'Egypt',\n \"Men's Bib-Shorts\",\n '2025-08-31',\n '04-4281278',\n false,\n '96',\n 6,\n 1,\n ],\n [\n false,\n 'Midel',\n 'United States',\n \"Men's Sports Shorts\",\n '2025-06-27',\n '55-1711908',\n true,\n '108',\n 10,\n 3,\n ],\n [\n false,\n 'Yodo',\n 'India',\n 'ML Mountain Frame',\n '2025-03-16',\n '58-8360815',\n false,\n '46',\n 1,\n 1,\n ],\n [\n false,\n 'Camido',\n 'Russia',\n 'ML Mountain Frame-W',\n '2025-09-13',\n '10-3786104',\n true,\n '97',\n 8,\n 3,\n ],\n [\n false,\n 'Eire',\n 'Thailand',\n 'ML Road Frame',\n '2025-04-10',\n '45-1186054',\n true,\n '161',\n 1,\n 4,\n ],\n [\n false,\n 'Vinte',\n 'United Kingdom',\n 'ML Road Frame-W',\n '2025-01-22',\n '62-6202742',\n true,\n '58',\n 4,\n 3,\n ],\n [\n false,\n 'Twitterlist',\n 'China',\n 'Mountain Bike Socks',\n '2025-11-09',\n '88-9646223',\n true,\n '92',\n 8,\n 3,\n ],\n [\n false,\n 'Eidel',\n 'Bangladesh',\n 'Mountain-100',\n '2025-09-19',\n '45-5588112',\n true,\n '5',\n 6,\n 5,\n ],\n [\n false,\n 'Trunyx',\n 'Nigeria',\n 'Mountain-200',\n '2025-03-09',\n '66-6271819',\n true,\n '158',\n 4,\n 1,\n ],\n [\n false,\n 'Katz',\n 'Turkey',\n 'Mountain-300',\n '2025-03-05',\n '38-9245023',\n false,\n '121',\n 5,\n 4,\n ],\n [\n false,\n 'Kaymbo',\n 'United States',\n 'Mountain-400-W',\n '2025-12-24',\n '44-5916927',\n false,\n '61',\n 5,\n 4,\n ],\n [\n false,\n 'Ozu',\n 'Pakistan',\n 'Mountain-500',\n '2025-06-13',\n '31-5449914',\n true,\n '155',\n 2,\n 2,\n ],\n [\n false,\n 'Rhynyx',\n 'India',\n 'Racing Socks',\n '2025-12-05',\n '19-9413869',\n true,\n '162',\n 2,\n 4,\n ],\n [\n false,\n 'Flashset',\n 'Iran',\n 'Road-150',\n '2025-12-14',\n '25-9807605',\n false,\n '46',\n 7,\n 1,\n ],\n [\n false,\n 'Yata',\n 'Congo (Kinshasa)',\n 'Road-250',\n '2025-06-12',\n '74-4291983',\n true,\n '47',\n 4,\n 4,\n ],\n [\n false,\n 'Brainlounge',\n 'Vietnam',\n 'Road-350-W',\n '2025-03-10',\n '83-0980643',\n true,\n '104',\n 2,\n 3,\n ],\n [\n false,\n 'Babblestorm',\n 'United States',\n 'Road-450',\n '2025-10-10',\n '19-2878430',\n true,\n '101',\n 6,\n 4,\n ],\n [\n false,\n 'Youspan',\n 'Brazil',\n 'Road-550-W',\n '2025-12-16',\n '19-1838230',\n true,\n '150',\n 10,\n 3,\n ],\n [\n false,\n 'Nlounge',\n 'China',\n 'Road-650',\n '2025-10-31',\n '32-2267938',\n true,\n '42',\n 4,\n 2,\n ],\n [\n false,\n 'Twinte',\n 'India',\n 'Road-750',\n '2025-08-17',\n '79-2821972',\n true,\n '144',\n 9,\n 3,\n ],\n [\n false,\n 'Oyonder',\n 'United Kingdom',\n 'Short-Sleeve Classic Jersey',\n '2025-12-04',\n '46-6597557',\n true,\n '195',\n 4,\n 1,\n ],\n [\n false,\n 'Gigabox',\n 'Pakistan',\n 'Sport-100',\n '2025-02-03',\n '15-1793960',\n true,\n '199',\n 4,\n 4,\n ],\n [\n false,\n 'Livetube',\n 'France',\n 'Touring-1000',\n '2025-05-16',\n '86-0811003',\n true,\n '110',\n 4,\n 5,\n ],\n [\n false,\n 'Voomm',\n 'United Kingdom',\n 'Touring-2000',\n '2025-07-15',\n '95-3068680',\n true,\n '51',\n 4,\n 4,\n ],\n [\n false,\n 'Voonyx',\n 'China',\n 'Touring-3000',\n '2025-11-27',\n '35-3085360',\n false,\n '69',\n 2,\n 5,\n ],\n [\n false,\n 'Zoombeat',\n 'United States',\n \"Women's Mountain Shorts\",\n '2025-11-03',\n '56-8673088',\n false,\n '53',\n 2,\n 3,\n ],\n [\n false,\n 'Roomm',\n 'China',\n \"Women's Tights\",\n '2025-03-16',\n '76-0085918',\n true,\n '168',\n 1,\n 1,\n ],\n [\n false,\n 'Leenti',\n 'China',\n 'Mountain-400',\n '2025-05-16',\n '03-0893276',\n false,\n '58',\n 1,\n 4,\n ],\n [\n false,\n 'Jetpulse',\n 'United States',\n 'Road-550',\n '2025-02-08',\n '79-9013306',\n true,\n '152',\n 9,\n 3,\n ],\n [\n false,\n 'Katz',\n 'Peru',\n 'Road-350',\n '2025-02-15',\n '55-7799920',\n true,\n '66',\n 4,\n 2,\n ],\n [\n false,\n 'Cogidoo',\n 'India',\n 'LL Mountain Front Wheel',\n '2025-06-04',\n '07-0881122',\n false,\n '112',\n 9,\n 2,\n ],\n [\n false,\n 'Divavu',\n 'Colombia',\n 'Touring Rear Wheel',\n '2025-02-24',\n '58-6157387',\n true,\n '50',\n 10,\n 4,\n ],\n [\n false,\n 'Mydeo',\n 'China',\n 'Touring Front Wheel',\n '2025-12-07',\n '12-2810010',\n false,\n '31',\n 3,\n 5,\n ],\n [\n false,\n 'Browsebug',\n 'Japan',\n 'ML Mountain Front Wheel',\n '2025-01-14',\n '64-9249984',\n true,\n '132',\n 5,\n 5,\n ],\n [\n false,\n 'Layo',\n 'China',\n 'HL Mountain Front Wheel',\n '2025-04-24',\n '45-0739652',\n true,\n '45',\n 1,\n 5,\n ],\n [\n false,\n 'Snaptags',\n 'United Kingdom',\n 'LL Touring Handlebars',\n '2025-08-06',\n '09-5712761',\n true,\n '197',\n 4,\n 2,\n ],\n [\n false,\n 'Cogilith',\n 'China',\n 'HL Touring Handlebars',\n '2025-05-31',\n '01-7345008',\n true,\n '190',\n 4,\n 3,\n ],\n [\n false,\n 'Reallinks',\n 'United Kingdom',\n 'LL Road Front Wheel',\n '2025-05-14',\n '62-1065350',\n true,\n '184',\n 3,\n 4,\n ],\n [\n false,\n 'Quaxo',\n 'United States',\n 'ML Road Front Wheel',\n '2025-03-23',\n '44-7241323',\n true,\n '169',\n 3,\n 4,\n ],\n [\n false,\n 'Devify',\n 'China',\n 'HL Road Front Wheel',\n '2025-12-12',\n '52-0295699',\n false,\n '152',\n 4,\n 4,\n ],\n [\n false,\n 'Youopia',\n 'Angola',\n 'LL Mountain Handlebars',\n '2025-04-01',\n '52-2650922',\n false,\n '182',\n 6,\n 4,\n ],\n [\n false,\n 'Ainyx',\n 'China',\n 'Touring Pedal',\n '2025-02-27',\n '48-3618525',\n true,\n '141',\n 6,\n 1,\n ],\n [\n false,\n 'Browsetype',\n 'Malaysia',\n 'ML Mountain Handlebars',\n '2025-04-28',\n '51-8893923',\n true,\n '169',\n 7,\n 1,\n ],\n [\n false,\n 'Muxo',\n 'China',\n 'HL Mountain Handlebars',\n '2025-08-22',\n '68-5911361',\n false,\n '39',\n 7,\n 1,\n ],\n [\n false,\n 'Bubbletube',\n 'China',\n 'LL Road Handlebars',\n '2025-10-04',\n '41-5880042',\n true,\n '71',\n 8,\n 3,\n ],\n [\n false,\n 'Fadeo',\n 'Vietnam',\n 'ML Road Handlebars',\n '2025-04-23',\n '90-5913983',\n true,\n '148',\n 10,\n 3,\n ],\n [\n false,\n 'Yadel',\n 'United Kingdom',\n 'HL Road Handlebars',\n '2025-04-18',\n '92-0960699',\n true,\n '116',\n 8,\n 1,\n ],\n [\n false,\n 'Blognation',\n 'China',\n 'LL Headset',\n '2025-01-10',\n '06-9493898',\n true,\n '96',\n 10,\n 1,\n ],\n [\n false,\n 'Devpoint',\n 'China',\n 'ML Headset',\n '2025-12-25',\n '69-5878565',\n true,\n '35',\n 4,\n 2,\n ],\n [\n false,\n 'Aibox',\n 'United Kingdom',\n 'HL Headset',\n '2025-03-18',\n '13-1133017',\n true,\n '16',\n 8,\n 2,\n ],\n [\n false,\n 'Brightdog',\n 'China',\n 'LL Mountain Pedal',\n '2025-09-11',\n '39-6530433',\n true,\n '194',\n 2,\n 5,\n ],\n [\n false,\n 'Gabcube',\n 'Nigeria',\n 'ML Mountain Pedal',\n '2025-04-22',\n '96-6860388',\n true,\n '24',\n 1,\n 3,\n ],\n [\n false,\n 'Muxo',\n 'China',\n 'HL Mountain Pedal',\n '2025-06-05',\n '30-0356137',\n true,\n '170',\n 4,\n 4,\n ],\n [\n false,\n 'Tambee',\n 'China',\n 'ML Touring Seat/Saddle',\n '2025-02-22',\n '93-9058255',\n true,\n '184',\n 9,\n 5,\n ],\n [\n false,\n 'Cogilith',\n 'India',\n 'LL Touring Seat/Saddle',\n '2025-04-06',\n '82-9268909',\n false,\n '153',\n 10,\n 4,\n ],\n [\n false,\n 'Dynabox',\n 'Hong Kong',\n 'HL Touring Seat/Saddle',\n '2025-01-10',\n '20-6913815',\n false,\n '88',\n 10,\n 1,\n ],\n [\n false,\n 'Shuffledrive',\n 'Sudan',\n 'LL Road Pedal',\n '2025-09-16',\n '08-8238817',\n true,\n '57',\n 9,\n 2,\n ],\n [\n false,\n 'Fivechat',\n 'China',\n 'ML Road Pedal',\n '2025-08-26',\n '44-7370350',\n false,\n '62',\n 4,\n 1,\n ],\n [\n false,\n 'Meembee',\n 'United States',\n 'HL Road Pedal',\n '2025-12-27',\n '01-3525949',\n true,\n '123',\n 2,\n 4,\n ],\n [\n false,\n 'Dynazzy',\n 'United Kingdom',\n 'LL Mountain Seat/Saddle 1',\n '2025-12-15',\n '04-2414623',\n true,\n '77',\n 10,\n 5,\n ],\n [\n false,\n 'Eare',\n 'China',\n 'ML Mountain Seat/Saddle 1',\n '2025-04-04',\n '15-1917509',\n false,\n '199',\n 9,\n 4,\n ],\n [\n false,\n 'Yozio',\n 'China',\n 'HL Mountain Seat/Saddle 1',\n '2025-03-15',\n '06-2526845',\n true,\n '149',\n 8,\n 2,\n ],\n [\n false,\n 'Quinu',\n \"Xi'an\",\n '425-777-7829',\n '2025-02-22',\n '83-1713558',\n false,\n '191',\n 9,\n 5,\n ],\n [\n false,\n 'Jazzy',\n 'United Kingdom',\n 'ML Road Seat/Saddle 1',\n '2025-08-07',\n '00-8892524',\n true,\n '150',\n 10,\n 2,\n ],\n [\n false,\n 'Thoughtsphere',\n 'China',\n 'HL Road Seat/Saddle 1',\n '2025-11-28',\n '39-5538991',\n true,\n '130',\n 7,\n 3,\n ],\n [\n false,\n 'Leenti',\n 'China',\n 'ML Road Rear Wheel',\n '2025-12-29',\n '06-9002973',\n true,\n '179',\n 1,\n 2,\n ],\n [\n false,\n 'Quaxo',\n 'United Kingdom',\n 'HL Road Rear Wheel',\n '2025-09-06',\n '73-6104901',\n true,\n '98',\n 5,\n 3,\n ],\n [\n false,\n 'Tanoodle',\n 'Chile',\n 'LL Mountain Seat/Saddle 2',\n '2025-05-24',\n '68-7384479',\n true,\n '175',\n 2,\n 3,\n ],\n [\n false,\n 'Feednation',\n 'China',\n 'ML Mountain Seat/Saddle 2',\n '2025-11-21',\n '26-7757763',\n true,\n '11',\n 1,\n 3,\n ],\n [\n false,\n 'Kayveo',\n 'China',\n 'HL Mountain Seat/Saddle 2',\n '2025-06-21',\n '07-4873562',\n false,\n '184',\n 7,\n 4,\n ],\n [\n false,\n 'Meevee',\n 'Saudi Arabia',\n 'LL Road Seat/Saddle 1',\n '2025-11-16',\n '46-5819554',\n false,\n '27',\n 9,\n 3,\n ],\n [\n false,\n 'Twitterworks',\n 'China',\n 'ML Road Seat/Saddle 2',\n '2025-04-19',\n '01-2666826',\n true,\n '186',\n 3,\n 2,\n ],\n [\n false,\n 'Wikizz',\n 'Tanzania',\n 'HL Road Seat/Saddle 2',\n '2025-03-08',\n '54-7090503',\n true,\n '20',\n 3,\n 3,\n ],\n [\n false,\n 'Yoveo',\n 'United States',\n 'LL Mountain Tire',\n '2025-10-14',\n '78-7658520',\n false,\n '153',\n 2,\n 1,\n ],\n [\n false,\n 'Yakidoo',\n 'China',\n 'ML Mountain Tire',\n '2025-10-12',\n '23-9926318',\n true,\n '161',\n 8,\n 5,\n ],\n [\n false,\n 'Oyope',\n 'China',\n 'HL Mountain Tire',\n '2025-09-20',\n '20-0179517',\n true,\n '98',\n 10,\n 5,\n ],\n [\n false,\n 'Skipstorm',\n 'United States',\n 'LL Road Tire',\n '2025-10-01',\n '02-9543343',\n true,\n '30',\n 7,\n 3,\n ],\n [\n false,\n 'Minyx',\n 'United States',\n 'ML Road Tire',\n '2025-07-07',\n '98-3938169',\n true,\n '73',\n 10,\n 2,\n ],\n [\n false,\n 'Miboo',\n 'China',\n 'HL Road Tire',\n '2025-07-25',\n '68-5197934',\n true,\n '158',\n 9,\n 1,\n ],\n [\n false,\n 'Realfire',\n 'United States',\n 'Touring Tire',\n '2025-08-27',\n '39-8260460',\n true,\n '122',\n 5,\n 2,\n ],\n [\n false,\n 'Shufflester',\n 'China',\n 'Mountain Tire Tube',\n '2025-06-08',\n '45-9776170',\n true,\n '33',\n 2,\n 4,\n ],\n [\n false,\n 'Ntag',\n 'China',\n 'Road Tire Tube',\n '2025-12-06',\n '45-0858451',\n true,\n '107',\n 6,\n 2,\n ],\n [\n false,\n 'Jabberbean',\n 'United States',\n 'Touring Tire Tube',\n '2025-04-26',\n '15-4247305',\n true,\n '15',\n 1,\n 2,\n ],\n [\n false,\n 'Thoughtblab',\n 'China',\n 'LL Bottom Bracket',\n '2025-05-21',\n '15-8534931',\n true,\n '168',\n 5,\n 2,\n ],\n [\n false,\n 'Jabbertype',\n 'China',\n 'Classic Vest',\n '2025-07-25',\n '23-1251557',\n true,\n '135',\n 4,\n 2,\n ],\n [\n false,\n 'Buzzshare',\n 'United Kingdom',\n 'Cycling Cap',\n '2025-07-07',\n '86-5920601',\n true,\n '11',\n 1,\n 4,\n ],\n [\n false,\n 'Roodel',\n 'United States',\n 'Full-Finger Gloves',\n '2025-01-13',\n '48-1055459',\n true,\n '41',\n 6,\n 4,\n ],\n [\n false,\n 'Zoovu',\n 'China',\n 'Half-Finger Gloves',\n '2025-06-03',\n '12-7842022',\n true,\n '144',\n 6,\n 1,\n ],\n [\n false,\n 'Photofeed',\n 'China',\n 'HL Mountain Frame',\n '2025-07-14',\n '94-5088099',\n true,\n '106',\n 1,\n 4,\n ],\n];\n\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(\n TD: HTMLTableCellElement,\n row: number,\n column: number,\n _prop: string | number,\n _value: Handsontable.CellValue,\n cellProperties: CellProperties\n) {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\n@Component({\n selector: 'example1-demo',\n standalone: true,\n imports: [HotTableModule],\n template: ``,\n})\nexport class AppComponent {\n readonly initialData = data;\n readonly gridSettings: GridSettings = {\n height: 450,\n colWidths: [180, 220, 140, 120, 120, 120, 140],\n colHeaders: [\n 'Company Name',\n 'Name',\n 'Sell date',\n 'In stock',\n 'Quantity',\n 'Order ID',\n 'Country',\n ],\n contextMenu: [\n 'cut',\n 'copy',\n '---------',\n 'row_above',\n 'row_below',\n 'remove_row',\n '---------',\n 'alignment',\n 'make_read_only',\n 'clear_column',\n ] as PredefinedMenuItemKey[],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n headerClassName: 'htLeft',\n beforeRenderer: addClassesToRows,\n manualRowMove: true,\n autoWrapRow: true,\n autoWrapCol: true,\n autoRowSize: true,\n manualRowResize: true,\n manualColumnResize: true,\n navigableHeaders: true,\n imeFastEdit: true,\n columns: [\n { data: 1 },\n { data: 3 },\n { data: 4, type: 'intl-date' },\n { data: 6, type: 'checkbox', className: 'htCenter' },\n { data: 7, type: 'numeric' },\n { data: 5 },\n { data: 2 },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/demo/angular/example1.ts","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/demo","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Demo · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\nimport { CellProperties } from 'handsontable/settings';\nimport { PredefinedMenuItemKey } from 'handsontable/plugins/contextMenu';\n\n// constants.ts\nexport const data = [\n [\n false,\n 'Tagcat',\n 'United Kingdom',\n 'Classic Vest',\n '2025-10-11',\n '01-2331942',\n true,\n '172',\n 2,\n 2,\n ],\n [\n true,\n 'Zoomzone',\n 'Indonesia',\n 'Cycling Cap',\n '2025-05-03',\n '88-2768633',\n true,\n '188',\n 6,\n 2,\n ],\n [\n true,\n 'Meeveo',\n 'United States',\n 'Full-Finger Gloves',\n '2025-03-27',\n '51-6775945',\n true,\n '162',\n 1,\n 3,\n ],\n [\n false,\n 'Buzzdog',\n 'Philippines',\n 'HL Mountain Frame',\n '2025-08-29',\n '44-4028109',\n true,\n '133',\n 7,\n 1,\n ],\n [\n true,\n 'Katz',\n 'India',\n 'Half-Finger Gloves',\n '2025-10-02',\n '08-2758492',\n true,\n '87',\n 1,\n 3,\n ],\n [\n false,\n 'Jaxbean',\n 'China',\n 'HL Road Frame',\n '2025-09-28',\n '84-3557705',\n false,\n '26',\n 8,\n 1,\n ],\n [\n false,\n 'Wikido',\n 'Brazil',\n 'HL Touring Frame',\n '2025-06-24',\n '20-9397637',\n false,\n '110',\n 4,\n 1,\n ],\n [\n false,\n 'Browsedrive',\n 'United States',\n 'LL Mountain Frame',\n '2025-03-13',\n '36-0079556',\n true,\n '50',\n 4,\n 4,\n ],\n [\n false,\n 'Twinder',\n 'United Kingdom',\n 'LL Road Frame',\n '2025-04-06',\n '41-1489542',\n false,\n '160',\n 6,\n 1,\n ],\n [\n false,\n 'Jetwire',\n 'China',\n 'LL Touring Frame',\n '2025-02-01',\n '37-1531629',\n true,\n '30',\n 8,\n 5,\n ],\n [\n false,\n 'Chatterpoint',\n 'China',\n 'Long-Sleeve Logo Jersey',\n '2025-07-14',\n '25-5083429',\n true,\n '39',\n 7,\n 2,\n ],\n [\n false,\n 'Twinder',\n 'Egypt',\n \"Men's Bib-Shorts\",\n '2025-08-31',\n '04-4281278',\n false,\n '96',\n 6,\n 1,\n ],\n [\n false,\n 'Midel',\n 'United States',\n \"Men's Sports Shorts\",\n '2025-06-27',\n '55-1711908',\n true,\n '108',\n 10,\n 3,\n ],\n [\n false,\n 'Yodo',\n 'India',\n 'ML Mountain Frame',\n '2025-03-16',\n '58-8360815',\n false,\n '46',\n 1,\n 1,\n ],\n [\n false,\n 'Camido',\n 'Russia',\n 'ML Mountain Frame-W',\n '2025-09-13',\n '10-3786104',\n true,\n '97',\n 8,\n 3,\n ],\n [\n false,\n 'Eire',\n 'Thailand',\n 'ML Road Frame',\n '2025-04-10',\n '45-1186054',\n true,\n '161',\n 1,\n 4,\n ],\n [\n false,\n 'Vinte',\n 'United Kingdom',\n 'ML Road Frame-W',\n '2025-01-22',\n '62-6202742',\n true,\n '58',\n 4,\n 3,\n ],\n [\n false,\n 'Twitterlist',\n 'China',\n 'Mountain Bike Socks',\n '2025-11-09',\n '88-9646223',\n true,\n '92',\n 8,\n 3,\n ],\n [\n false,\n 'Eidel',\n 'Bangladesh',\n 'Mountain-100',\n '2025-09-19',\n '45-5588112',\n true,\n '5',\n 6,\n 5,\n ],\n [\n false,\n 'Trunyx',\n 'Nigeria',\n 'Mountain-200',\n '2025-03-09',\n '66-6271819',\n true,\n '158',\n 4,\n 1,\n ],\n [\n false,\n 'Katz',\n 'Turkey',\n 'Mountain-300',\n '2025-03-05',\n '38-9245023',\n false,\n '121',\n 5,\n 4,\n ],\n [\n false,\n 'Kaymbo',\n 'United States',\n 'Mountain-400-W',\n '2025-12-24',\n '44-5916927',\n false,\n '61',\n 5,\n 4,\n ],\n [\n false,\n 'Ozu',\n 'Pakistan',\n 'Mountain-500',\n '2025-06-13',\n '31-5449914',\n true,\n '155',\n 2,\n 2,\n ],\n [\n false,\n 'Rhynyx',\n 'India',\n 'Racing Socks',\n '2025-12-05',\n '19-9413869',\n true,\n '162',\n 2,\n 4,\n ],\n [\n false,\n 'Flashset',\n 'Iran',\n 'Road-150',\n '2025-12-14',\n '25-9807605',\n false,\n '46',\n 7,\n 1,\n ],\n [\n false,\n 'Yata',\n 'Congo (Kinshasa)',\n 'Road-250',\n '2025-06-12',\n '74-4291983',\n true,\n '47',\n 4,\n 4,\n ],\n [\n false,\n 'Brainlounge',\n 'Vietnam',\n 'Road-350-W',\n '2025-03-10',\n '83-0980643',\n true,\n '104',\n 2,\n 3,\n ],\n [\n false,\n 'Babblestorm',\n 'United States',\n 'Road-450',\n '2025-10-10',\n '19-2878430',\n true,\n '101',\n 6,\n 4,\n ],\n [\n false,\n 'Youspan',\n 'Brazil',\n 'Road-550-W',\n '2025-12-16',\n '19-1838230',\n true,\n '150',\n 10,\n 3,\n ],\n [\n false,\n 'Nlounge',\n 'China',\n 'Road-650',\n '2025-10-31',\n '32-2267938',\n true,\n '42',\n 4,\n 2,\n ],\n [\n false,\n 'Twinte',\n 'India',\n 'Road-750',\n '2025-08-17',\n '79-2821972',\n true,\n '144',\n 9,\n 3,\n ],\n [\n false,\n 'Oyonder',\n 'United Kingdom',\n 'Short-Sleeve Classic Jersey',\n '2025-12-04',\n '46-6597557',\n true,\n '195',\n 4,\n 1,\n ],\n [\n false,\n 'Gigabox',\n 'Pakistan',\n 'Sport-100',\n '2025-02-03',\n '15-1793960',\n true,\n '199',\n 4,\n 4,\n ],\n [\n false,\n 'Livetube',\n 'France',\n 'Touring-1000',\n '2025-05-16',\n '86-0811003',\n true,\n '110',\n 4,\n 5,\n ],\n [\n false,\n 'Voomm',\n 'United Kingdom',\n 'Touring-2000',\n '2025-07-15',\n '95-3068680',\n true,\n '51',\n 4,\n 4,\n ],\n [\n false,\n 'Voonyx',\n 'China',\n 'Touring-3000',\n '2025-11-27',\n '35-3085360',\n false,\n '69',\n 2,\n 5,\n ],\n [\n false,\n 'Zoombeat',\n 'United States',\n \"Women's Mountain Shorts\",\n '2025-11-03',\n '56-8673088',\n false,\n '53',\n 2,\n 3,\n ],\n [\n false,\n 'Roomm',\n 'China',\n \"Women's Tights\",\n '2025-03-16',\n '76-0085918',\n true,\n '168',\n 1,\n 1,\n ],\n [\n false,\n 'Leenti',\n 'China',\n 'Mountain-400',\n '2025-05-16',\n '03-0893276',\n false,\n '58',\n 1,\n 4,\n ],\n [\n false,\n 'Jetpulse',\n 'United States',\n 'Road-550',\n '2025-02-08',\n '79-9013306',\n true,\n '152',\n 9,\n 3,\n ],\n [\n false,\n 'Katz',\n 'Peru',\n 'Road-350',\n '2025-02-15',\n '55-7799920',\n true,\n '66',\n 4,\n 2,\n ],\n [\n false,\n 'Cogidoo',\n 'India',\n 'LL Mountain Front Wheel',\n '2025-06-04',\n '07-0881122',\n false,\n '112',\n 9,\n 2,\n ],\n [\n false,\n 'Divavu',\n 'Colombia',\n 'Touring Rear Wheel',\n '2025-02-24',\n '58-6157387',\n true,\n '50',\n 10,\n 4,\n ],\n [\n false,\n 'Mydeo',\n 'China',\n 'Touring Front Wheel',\n '2025-12-07',\n '12-2810010',\n false,\n '31',\n 3,\n 5,\n ],\n [\n false,\n 'Browsebug',\n 'Japan',\n 'ML Mountain Front Wheel',\n '2025-01-14',\n '64-9249984',\n true,\n '132',\n 5,\n 5,\n ],\n [\n false,\n 'Layo',\n 'China',\n 'HL Mountain Front Wheel',\n '2025-04-24',\n '45-0739652',\n true,\n '45',\n 1,\n 5,\n ],\n [\n false,\n 'Snaptags',\n 'United Kingdom',\n 'LL Touring Handlebars',\n '2025-08-06',\n '09-5712761',\n true,\n '197',\n 4,\n 2,\n ],\n [\n false,\n 'Cogilith',\n 'China',\n 'HL Touring Handlebars',\n '2025-05-31',\n '01-7345008',\n true,\n '190',\n 4,\n 3,\n ],\n [\n false,\n 'Reallinks',\n 'United Kingdom',\n 'LL Road Front Wheel',\n '2025-05-14',\n '62-1065350',\n true,\n '184',\n 3,\n 4,\n ],\n [\n false,\n 'Quaxo',\n 'United States',\n 'ML Road Front Wheel',\n '2025-03-23',\n '44-7241323',\n true,\n '169',\n 3,\n 4,\n ],\n [\n false,\n 'Devify',\n 'China',\n 'HL Road Front Wheel',\n '2025-12-12',\n '52-0295699',\n false,\n '152',\n 4,\n 4,\n ],\n [\n false,\n 'Youopia',\n 'Angola',\n 'LL Mountain Handlebars',\n '2025-04-01',\n '52-2650922',\n false,\n '182',\n 6,\n 4,\n ],\n [\n false,\n 'Ainyx',\n 'China',\n 'Touring Pedal',\n '2025-02-27',\n '48-3618525',\n true,\n '141',\n 6,\n 1,\n ],\n [\n false,\n 'Browsetype',\n 'Malaysia',\n 'ML Mountain Handlebars',\n '2025-04-28',\n '51-8893923',\n true,\n '169',\n 7,\n 1,\n ],\n [\n false,\n 'Muxo',\n 'China',\n 'HL Mountain Handlebars',\n '2025-08-22',\n '68-5911361',\n false,\n '39',\n 7,\n 1,\n ],\n [\n false,\n 'Bubbletube',\n 'China',\n 'LL Road Handlebars',\n '2025-10-04',\n '41-5880042',\n true,\n '71',\n 8,\n 3,\n ],\n [\n false,\n 'Fadeo',\n 'Vietnam',\n 'ML Road Handlebars',\n '2025-04-23',\n '90-5913983',\n true,\n '148',\n 10,\n 3,\n ],\n [\n false,\n 'Yadel',\n 'United Kingdom',\n 'HL Road Handlebars',\n '2025-04-18',\n '92-0960699',\n true,\n '116',\n 8,\n 1,\n ],\n [\n false,\n 'Blognation',\n 'China',\n 'LL Headset',\n '2025-01-10',\n '06-9493898',\n true,\n '96',\n 10,\n 1,\n ],\n [\n false,\n 'Devpoint',\n 'China',\n 'ML Headset',\n '2025-12-25',\n '69-5878565',\n true,\n '35',\n 4,\n 2,\n ],\n [\n false,\n 'Aibox',\n 'United Kingdom',\n 'HL Headset',\n '2025-03-18',\n '13-1133017',\n true,\n '16',\n 8,\n 2,\n ],\n [\n false,\n 'Brightdog',\n 'China',\n 'LL Mountain Pedal',\n '2025-09-11',\n '39-6530433',\n true,\n '194',\n 2,\n 5,\n ],\n [\n false,\n 'Gabcube',\n 'Nigeria',\n 'ML Mountain Pedal',\n '2025-04-22',\n '96-6860388',\n true,\n '24',\n 1,\n 3,\n ],\n [\n false,\n 'Muxo',\n 'China',\n 'HL Mountain Pedal',\n '2025-06-05',\n '30-0356137',\n true,\n '170',\n 4,\n 4,\n ],\n [\n false,\n 'Tambee',\n 'China',\n 'ML Touring Seat/Saddle',\n '2025-02-22',\n '93-9058255',\n true,\n '184',\n 9,\n 5,\n ],\n [\n false,\n 'Cogilith',\n 'India',\n 'LL Touring Seat/Saddle',\n '2025-04-06',\n '82-9268909',\n false,\n '153',\n 10,\n 4,\n ],\n [\n false,\n 'Dynabox',\n 'Hong Kong',\n 'HL Touring Seat/Saddle',\n '2025-01-10',\n '20-6913815',\n false,\n '88',\n 10,\n 1,\n ],\n [\n false,\n 'Shuffledrive',\n 'Sudan',\n 'LL Road Pedal',\n '2025-09-16',\n '08-8238817',\n true,\n '57',\n 9,\n 2,\n ],\n [\n false,\n 'Fivechat',\n 'China',\n 'ML Road Pedal',\n '2025-08-26',\n '44-7370350',\n false,\n '62',\n 4,\n 1,\n ],\n [\n false,\n 'Meembee',\n 'United States',\n 'HL Road Pedal',\n '2025-12-27',\n '01-3525949',\n true,\n '123',\n 2,\n 4,\n ],\n [\n false,\n 'Dynazzy',\n 'United Kingdom',\n 'LL Mountain Seat/Saddle 1',\n '2025-12-15',\n '04-2414623',\n true,\n '77',\n 10,\n 5,\n ],\n [\n false,\n 'Eare',\n 'China',\n 'ML Mountain Seat/Saddle 1',\n '2025-04-04',\n '15-1917509',\n false,\n '199',\n 9,\n 4,\n ],\n [\n false,\n 'Yozio',\n 'China',\n 'HL Mountain Seat/Saddle 1',\n '2025-03-15',\n '06-2526845',\n true,\n '149',\n 8,\n 2,\n ],\n [\n false,\n 'Quinu',\n \"Xi'an\",\n '425-777-7829',\n '2025-02-22',\n '83-1713558',\n false,\n '191',\n 9,\n 5,\n ],\n [\n false,\n 'Jazzy',\n 'United Kingdom',\n 'ML Road Seat/Saddle 1',\n '2025-08-07',\n '00-8892524',\n true,\n '150',\n 10,\n 2,\n ],\n [\n false,\n 'Thoughtsphere',\n 'China',\n 'HL Road Seat/Saddle 1',\n '2025-11-28',\n '39-5538991',\n true,\n '130',\n 7,\n 3,\n ],\n [\n false,\n 'Leenti',\n 'China',\n 'ML Road Rear Wheel',\n '2025-12-29',\n '06-9002973',\n true,\n '179',\n 1,\n 2,\n ],\n [\n false,\n 'Quaxo',\n 'United Kingdom',\n 'HL Road Rear Wheel',\n '2025-09-06',\n '73-6104901',\n true,\n '98',\n 5,\n 3,\n ],\n [\n false,\n 'Tanoodle',\n 'Chile',\n 'LL Mountain Seat/Saddle 2',\n '2025-05-24',\n '68-7384479',\n true,\n '175',\n 2,\n 3,\n ],\n [\n false,\n 'Feednation',\n 'China',\n 'ML Mountain Seat/Saddle 2',\n '2025-11-21',\n '26-7757763',\n true,\n '11',\n 1,\n 3,\n ],\n [\n false,\n 'Kayveo',\n 'China',\n 'HL Mountain Seat/Saddle 2',\n '2025-06-21',\n '07-4873562',\n false,\n '184',\n 7,\n 4,\n ],\n [\n false,\n 'Meevee',\n 'Saudi Arabia',\n 'LL Road Seat/Saddle 1',\n '2025-11-16',\n '46-5819554',\n false,\n '27',\n 9,\n 3,\n ],\n [\n false,\n 'Twitterworks',\n 'China',\n 'ML Road Seat/Saddle 2',\n '2025-04-19',\n '01-2666826',\n true,\n '186',\n 3,\n 2,\n ],\n [\n false,\n 'Wikizz',\n 'Tanzania',\n 'HL Road Seat/Saddle 2',\n '2025-03-08',\n '54-7090503',\n true,\n '20',\n 3,\n 3,\n ],\n [\n false,\n 'Yoveo',\n 'United States',\n 'LL Mountain Tire',\n '2025-10-14',\n '78-7658520',\n false,\n '153',\n 2,\n 1,\n ],\n [\n false,\n 'Yakidoo',\n 'China',\n 'ML Mountain Tire',\n '2025-10-12',\n '23-9926318',\n true,\n '161',\n 8,\n 5,\n ],\n [\n false,\n 'Oyope',\n 'China',\n 'HL Mountain Tire',\n '2025-09-20',\n '20-0179517',\n true,\n '98',\n 10,\n 5,\n ],\n [\n false,\n 'Skipstorm',\n 'United States',\n 'LL Road Tire',\n '2025-10-01',\n '02-9543343',\n true,\n '30',\n 7,\n 3,\n ],\n [\n false,\n 'Minyx',\n 'United States',\n 'ML Road Tire',\n '2025-07-07',\n '98-3938169',\n true,\n '73',\n 10,\n 2,\n ],\n [\n false,\n 'Miboo',\n 'China',\n 'HL Road Tire',\n '2025-07-25',\n '68-5197934',\n true,\n '158',\n 9,\n 1,\n ],\n [\n false,\n 'Realfire',\n 'United States',\n 'Touring Tire',\n '2025-08-27',\n '39-8260460',\n true,\n '122',\n 5,\n 2,\n ],\n [\n false,\n 'Shufflester',\n 'China',\n 'Mountain Tire Tube',\n '2025-06-08',\n '45-9776170',\n true,\n '33',\n 2,\n 4,\n ],\n [\n false,\n 'Ntag',\n 'China',\n 'Road Tire Tube',\n '2025-12-06',\n '45-0858451',\n true,\n '107',\n 6,\n 2,\n ],\n [\n false,\n 'Jabberbean',\n 'United States',\n 'Touring Tire Tube',\n '2025-04-26',\n '15-4247305',\n true,\n '15',\n 1,\n 2,\n ],\n [\n false,\n 'Thoughtblab',\n 'China',\n 'LL Bottom Bracket',\n '2025-05-21',\n '15-8534931',\n true,\n '168',\n 5,\n 2,\n ],\n [\n false,\n 'Jabbertype',\n 'China',\n 'Classic Vest',\n '2025-07-25',\n '23-1251557',\n true,\n '135',\n 4,\n 2,\n ],\n [\n false,\n 'Buzzshare',\n 'United Kingdom',\n 'Cycling Cap',\n '2025-07-07',\n '86-5920601',\n true,\n '11',\n 1,\n 4,\n ],\n [\n false,\n 'Roodel',\n 'United States',\n 'Full-Finger Gloves',\n '2025-01-13',\n '48-1055459',\n true,\n '41',\n 6,\n 4,\n ],\n [\n false,\n 'Zoovu',\n 'China',\n 'Half-Finger Gloves',\n '2025-06-03',\n '12-7842022',\n true,\n '144',\n 6,\n 1,\n ],\n [\n false,\n 'Photofeed',\n 'China',\n 'HL Mountain Frame',\n '2025-07-14',\n '94-5088099',\n true,\n '106',\n 1,\n 4,\n ],\n];\n\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(\n TD: HTMLTableCellElement,\n row: number,\n column: number,\n _prop: string | number,\n _value: Handsontable.CellValue,\n cellProperties: CellProperties\n) {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\n@Component({\n selector: 'example1-demo',\n standalone: true,\n imports: [HotTableModule],\n template: ``,\n})\nexport class AppComponent {\n readonly initialData = data;\n readonly gridSettings: GridSettings = {\n height: 450,\n colWidths: [180, 220, 140, 120, 120, 120, 140],\n colHeaders: [\n 'Company Name',\n 'Name',\n 'Sell date',\n 'In stock',\n 'Quantity',\n 'Order ID',\n 'Country',\n ],\n contextMenu: [\n 'cut',\n 'copy',\n '---------',\n 'row_above',\n 'row_below',\n 'remove_row',\n '---------',\n 'alignment',\n 'make_read_only',\n 'clear_column',\n ] as PredefinedMenuItemKey[],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n headerClassName: 'htLeft',\n beforeRenderer: addClassesToRows,\n manualRowMove: true,\n autoWrapRow: true,\n autoWrapCol: true,\n autoRowSize: true,\n manualRowResize: true,\n manualColumnResize: true,\n navigableHeaders: true,\n imeFastEdit: true,\n columns: [\n { data: 1 },\n { data: 3 },\n { data: 4, type: 'intl-date' },\n { data: 6, type: 'checkbox', className: 'htCenter' },\n { data: 7, type: 'numeric' },\n { data: 5 },\n { data: 2 },\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/demo/angular/example1.ts","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/demo","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__javascript__example.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__javascript__example.js.json index bdde5bb80..3b539cc61 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__javascript__example.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__javascript__example.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Demo · example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// constants.js\nexport const data = [\n [false, 'Tagcat', 'United Kingdom', 'Classic Vest', '2025-10-11', '01-2331942', true, '172', 2, 2],\n [true, 'Zoomzone', 'Indonesia', 'Cycling Cap', '2025-05-03', '88-2768633', true, '188', 6, 2],\n [true, 'Meeveo', 'United States', 'Full-Finger Gloves', '2025-03-27', '51-6775945', true, '162', 1, 3],\n [false, 'Buzzdog', 'Philippines', 'HL Mountain Frame', '2025-08-29', '44-4028109', true, '133', 7, 1],\n [true, 'Katz', 'India', 'Half-Finger Gloves', '2025-10-02', '08-2758492', true, '87', 1, 3],\n [false, 'Jaxbean', 'China', 'HL Road Frame', '2025-09-28', '84-3557705', false, '26', 8, 1],\n [false, 'Wikido', 'Brazil', 'HL Touring Frame', '2025-06-24', '20-9397637', false, '110', 4, 1],\n [false, 'Browsedrive', 'United States', 'LL Mountain Frame', '2025-03-13', '36-0079556', true, '50', 4, 4],\n [false, 'Twinder', 'United Kingdom', 'LL Road Frame', '2025-04-06', '41-1489542', false, '160', 6, 1],\n [false, 'Jetwire', 'China', 'LL Touring Frame', '2025-02-01', '37-1531629', true, '30', 8, 5],\n [false, 'Chatterpoint', 'China', 'Long-Sleeve Logo Jersey', '2025-07-14', '25-5083429', true, '39', 7, 2],\n [false, 'Twinder', 'Egypt', \"Men's Bib-Shorts\", '2025-08-31', '04-4281278', false, '96', 6, 1],\n [false, 'Midel', 'United States', \"Men's Sports Shorts\", '2025-06-27', '55-1711908', true, '108', 10, 3],\n [false, 'Yodo', 'India', 'ML Mountain Frame', '2025-03-16', '58-8360815', false, '46', 1, 1],\n [false, 'Camido', 'Russia', 'ML Mountain Frame-W', '2025-09-13', '10-3786104', true, '97', 8, 3],\n [false, 'Eire', 'Thailand', 'ML Road Frame', '2025-04-10', '45-1186054', true, '161', 1, 4],\n [false, 'Vinte', 'United Kingdom', 'ML Road Frame-W', '2025-01-22', '62-6202742', true, '58', 4, 3],\n [false, 'Twitterlist', 'China', 'Mountain Bike Socks', '2025-11-09', '88-9646223', true, '92', 8, 3],\n [false, 'Eidel', 'Bangladesh', 'Mountain-100', '2025-09-19', '45-5588112', true, '5', 6, 5],\n [false, 'Trunyx', 'Nigeria', 'Mountain-200', '2025-03-09', '66-6271819', true, '158', 4, 1],\n [false, 'Katz', 'Turkey', 'Mountain-300', '2025-03-05', '38-9245023', false, '121', 5, 4],\n [false, 'Kaymbo', 'United States', 'Mountain-400-W', '2025-12-24', '44-5916927', false, '61', 5, 4],\n [false, 'Ozu', 'Pakistan', 'Mountain-500', '2025-06-13', '31-5449914', true, '155', 2, 2],\n [false, 'Rhynyx', 'India', 'Racing Socks', '2025-12-05', '19-9413869', true, '162', 2, 4],\n [false, 'Flashset', 'Iran', 'Road-150', '2025-12-14', '25-9807605', false, '46', 7, 1],\n [false, 'Yata', 'Congo (Kinshasa)', 'Road-250', '2025-06-12', '74-4291983', true, '47', 4, 4],\n [false, 'Brainlounge', 'Vietnam', 'Road-350-W', '2025-03-10', '83-0980643', true, '104', 2, 3],\n [false, 'Babblestorm', 'United States', 'Road-450', '2025-10-10', '19-2878430', true, '101', 6, 4],\n [false, 'Youspan', 'Brazil', 'Road-550-W', '2025-12-16', '19-1838230', true, '150', 10, 3],\n [false, 'Nlounge', 'China', 'Road-650', '2025-10-31', '32-2267938', true, '42', 4, 2],\n [false, 'Twinte', 'India', 'Road-750', '2025-08-17', '79-2821972', true, '144', 9, 3],\n [false, 'Oyonder', 'United Kingdom', 'Short-Sleeve Classic Jersey', '2025-12-04', '46-6597557', true, '195', 4, 1],\n [false, 'Gigabox', 'Pakistan', 'Sport-100', '2025-02-03', '15-1793960', true, '199', 4, 4],\n [false, 'Livetube', 'France', 'Touring-1000', '2025-05-16', '86-0811003', true, '110', 4, 5],\n [false, 'Voomm', 'United Kingdom', 'Touring-2000', '2025-07-15', '95-3068680', true, '51', 4, 4],\n [false, 'Voonyx', 'China', 'Touring-3000', '2025-11-27', '35-3085360', false, '69', 2, 5],\n [false, 'Zoombeat', 'United States', \"Women's Mountain Shorts\", '2025-11-03', '56-8673088', false, '53', 2, 3],\n [false, 'Roomm', 'China', \"Women's Tights\", '2025-03-16', '76-0085918', true, '168', 1, 1],\n [false, 'Leenti', 'China', 'Mountain-400', '2025-05-16', '03-0893276', false, '58', 1, 4],\n [false, 'Jetpulse', 'United States', 'Road-550', '2025-02-08', '79-9013306', true, '152', 9, 3],\n [false, 'Katz', 'Peru', 'Road-350', '2025-02-15', '55-7799920', true, '66', 4, 2],\n [false, 'Cogidoo', 'India', 'LL Mountain Front Wheel', '2025-06-04', '07-0881122', false, '112', 9, 2],\n [false, 'Divavu', 'Colombia', 'Touring Rear Wheel', '2025-02-24', '58-6157387', true, '50', 10, 4],\n [false, 'Mydeo', 'China', 'Touring Front Wheel', '2025-12-07', '12-2810010', false, '31', 3, 5],\n [false, 'Browsebug', 'Japan', 'ML Mountain Front Wheel', '2025-01-14', '64-9249984', true, '132', 5, 5],\n [false, 'Layo', 'China', 'HL Mountain Front Wheel', '2025-04-24', '45-0739652', true, '45', 1, 5],\n [false, 'Snaptags', 'United Kingdom', 'LL Touring Handlebars', '2025-08-06', '09-5712761', true, '197', 4, 2],\n [false, 'Cogilith', 'China', 'HL Touring Handlebars', '2025-05-31', '01-7345008', true, '190', 4, 3],\n [false, 'Reallinks', 'United Kingdom', 'LL Road Front Wheel', '2025-05-14', '62-1065350', true, '184', 3, 4],\n [false, 'Quaxo', 'United States', 'ML Road Front Wheel', '2025-03-23', '44-7241323', true, '169', 3, 4],\n [false, 'Devify', 'China', 'HL Road Front Wheel', '2025-12-12', '52-0295699', false, '152', 4, 4],\n [false, 'Youopia', 'Angola', 'LL Mountain Handlebars', '2025-04-01', '52-2650922', false, '182', 6, 4],\n [false, 'Ainyx', 'China', 'Touring Pedal', '2025-02-27', '48-3618525', true, '141', 6, 1],\n [false, 'Browsetype', 'Malaysia', 'ML Mountain Handlebars', '2025-04-28', '51-8893923', true, '169', 7, 1],\n [false, 'Muxo', 'China', 'HL Mountain Handlebars', '2025-08-22', '68-5911361', false, '39', 7, 1],\n [false, 'Bubbletube', 'China', 'LL Road Handlebars', '2025-10-04', '41-5880042', true, '71', 8, 3],\n [false, 'Fadeo', 'Vietnam', 'ML Road Handlebars', '2025-04-23', '90-5913983', true, '148', 10, 3],\n [false, 'Yadel', 'United Kingdom', 'HL Road Handlebars', '2025-04-18', '92-0960699', true, '116', 8, 1],\n [false, 'Blognation', 'China', 'LL Headset', '2025-01-10', '06-9493898', true, '96', 10, 1],\n [false, 'Devpoint', 'China', 'ML Headset', '2025-12-25', '69-5878565', true, '35', 4, 2],\n [false, 'Aibox', 'United Kingdom', 'HL Headset', '2025-03-18', '13-1133017', true, '16', 8, 2],\n [false, 'Brightdog', 'China', 'LL Mountain Pedal', '2025-09-11', '39-6530433', true, '194', 2, 5],\n [false, 'Gabcube', 'Nigeria', 'ML Mountain Pedal', '2025-04-22', '96-6860388', true, '24', 1, 3],\n [false, 'Muxo', 'China', 'HL Mountain Pedal', '2025-06-05', '30-0356137', true, '170', 4, 4],\n [false, 'Tambee', 'China', 'ML Touring Seat/Saddle', '2025-02-22', '93-9058255', true, '184', 9, 5],\n [false, 'Cogilith', 'India', 'LL Touring Seat/Saddle', '2025-04-06', '82-9268909', false, '153', 10, 4],\n [false, 'Dynabox', 'Hong Kong', 'HL Touring Seat/Saddle', '2025-01-10', '20-6913815', false, '88', 10, 1],\n [false, 'Shuffledrive', 'Sudan', 'LL Road Pedal', '2025-09-16', '08-8238817', true, '57', 9, 2],\n [false, 'Fivechat', 'China', 'ML Road Pedal', '2025-08-26', '44-7370350', false, '62', 4, 1],\n [false, 'Meembee', 'United States', 'HL Road Pedal', '2025-12-27', '01-3525949', true, '123', 2, 4],\n [false, 'Dynazzy', 'United Kingdom', 'LL Mountain Seat/Saddle 1', '2025-12-15', '04-2414623', true, '77', 10, 5],\n [false, 'Eare', 'China', 'ML Mountain Seat/Saddle 1', '2025-04-04', '15-1917509', false, '199', 9, 4],\n [false, 'Yozio', 'China', 'HL Mountain Seat/Saddle 1', '2025-03-15', '06-2526845', true, '149', 8, 2],\n [false, 'Quinu', \"Xi'an\", '425-777-7829', '2025-02-22', '83-1713558', false, '191', 9, 5],\n [false, 'Jazzy', 'United Kingdom', 'ML Road Seat/Saddle 1', '2025-08-07', '00-8892524', true, '150', 10, 2],\n [false, 'Thoughtsphere', 'China', 'HL Road Seat/Saddle 1', '2025-11-28', '39-5538991', true, '130', 7, 3],\n [false, 'Leenti', 'China', 'ML Road Rear Wheel', '2025-12-29', '06-9002973', true, '179', 1, 2],\n [false, 'Quaxo', 'United Kingdom', 'HL Road Rear Wheel', '2025-09-06', '73-6104901', true, '98', 5, 3],\n [false, 'Tanoodle', 'Chile', 'LL Mountain Seat/Saddle 2', '2025-05-24', '68-7384479', true, '175', 2, 3],\n [false, 'Feednation', 'China', 'ML Mountain Seat/Saddle 2', '2025-11-21', '26-7757763', true, '11', 1, 3],\n [false, 'Kayveo', 'China', 'HL Mountain Seat/Saddle 2', '2025-06-21', '07-4873562', false, '184', 7, 4],\n [false, 'Meevee', 'Saudi Arabia', 'LL Road Seat/Saddle 1', '2025-11-16', '46-5819554', false, '27', 9, 3],\n [false, 'Twitterworks', 'China', 'ML Road Seat/Saddle 2', '2025-04-19', '01-2666826', true, '186', 3, 2],\n [false, 'Wikizz', 'Tanzania', 'HL Road Seat/Saddle 2', '2025-03-08', '54-7090503', true, '20', 3, 3],\n [false, 'Yoveo', 'United States', 'LL Mountain Tire', '2025-10-14', '78-7658520', false, '153', 2, 1],\n [false, 'Yakidoo', 'China', 'ML Mountain Tire', '2025-10-12', '23-9926318', true, '161', 8, 5],\n [false, 'Oyope', 'China', 'HL Mountain Tire', '2025-09-20', '20-0179517', true, '98', 10, 5],\n [false, 'Skipstorm', 'United States', 'LL Road Tire', '2025-10-01', '02-9543343', true, '30', 7, 3],\n [false, 'Minyx', 'United States', 'ML Road Tire', '2025-07-07', '98-3938169', true, '73', 10, 2],\n [false, 'Miboo', 'China', 'HL Road Tire', '2025-07-25', '68-5197934', true, '158', 9, 1],\n [false, 'Realfire', 'United States', 'Touring Tire', '2025-08-27', '39-8260460', true, '122', 5, 2],\n [false, 'Shufflester', 'China', 'Mountain Tire Tube', '2025-06-08', '45-9776170', true, '33', 2, 4],\n [false, 'Ntag', 'China', 'Road Tire Tube', '2025-12-06', '45-0858451', true, '107', 6, 2],\n [false, 'Jabberbean', 'United States', 'Touring Tire Tube', '2025-04-26', '15-4247305', true, '15', 1, 2],\n [false, 'Thoughtblab', 'China', 'LL Bottom Bracket', '2025-05-21', '15-8534931', true, '168', 5, 2],\n [false, 'Jabbertype', 'China', 'Classic Vest', '2025-07-25', '23-1251557', true, '135', 4, 2],\n [false, 'Buzzshare', 'United Kingdom', 'Cycling Cap', '2025-07-07', '86-5920601', true, '11', 1, 4],\n [false, 'Roodel', 'United States', 'Full-Finger Gloves', '2025-01-13', '48-1055459', true, '41', 6, 4],\n [false, 'Zoovu', 'China', 'Half-Finger Gloves', '2025-06-03', '12-7842022', true, '144', 6, 1],\n [false, 'Photofeed', 'China', 'HL Mountain Frame', '2025-07-14', '94-5088099', true, '106', 1, 4],\n];\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(TD, row, column, _prop, _value, cellProperties) {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\nconst example = document.getElementById('example');\n\nnew Handsontable(example, {\n data,\n height: 450,\n width: '100%',\n colWidths: [180, 220, 140, 120, 120, 120, 140],\n colHeaders: ['Company Name', 'Name', 'Sell date', 'In stock', 'Quantity', 'Order ID', 'Country'],\n contextMenu: [\n 'cut',\n 'copy',\n '---------',\n 'row_above',\n 'row_below',\n 'remove_row',\n '---------',\n 'alignment',\n 'make_read_only',\n 'clear_column',\n ],\n columns: [\n { data: 1, type: 'text' },\n { data: 3, type: 'text' },\n {\n data: 4,\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 6,\n type: 'checkbox',\n className: 'htCenter',\n },\n { data: 7, type: 'numeric' },\n { data: 5, type: 'text' },\n { data: 2, type: 'text' },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n beforeRenderer: addClassesToRows,\n autoWrapRow: true,\n autoWrapCol: true,\n autoRowSize: true,\n manualRowResize: true,\n manualColumnResize: true,\n navigableHeaders: true,\n imeFastEdit: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconsole.log(`Handsontable: v${Handsontable.version} (${Handsontable.buildDate})`);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/demo/javascript/example.js","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example","exampleTitle":"example","docPermalink":"/demo","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Demo · example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// constants.js\nexport const data = [\n [false, 'Tagcat', 'United Kingdom', 'Classic Vest', '2025-10-11', '01-2331942', true, '172', 2, 2],\n [true, 'Zoomzone', 'Indonesia', 'Cycling Cap', '2025-05-03', '88-2768633', true, '188', 6, 2],\n [true, 'Meeveo', 'United States', 'Full-Finger Gloves', '2025-03-27', '51-6775945', true, '162', 1, 3],\n [false, 'Buzzdog', 'Philippines', 'HL Mountain Frame', '2025-08-29', '44-4028109', true, '133', 7, 1],\n [true, 'Katz', 'India', 'Half-Finger Gloves', '2025-10-02', '08-2758492', true, '87', 1, 3],\n [false, 'Jaxbean', 'China', 'HL Road Frame', '2025-09-28', '84-3557705', false, '26', 8, 1],\n [false, 'Wikido', 'Brazil', 'HL Touring Frame', '2025-06-24', '20-9397637', false, '110', 4, 1],\n [false, 'Browsedrive', 'United States', 'LL Mountain Frame', '2025-03-13', '36-0079556', true, '50', 4, 4],\n [false, 'Twinder', 'United Kingdom', 'LL Road Frame', '2025-04-06', '41-1489542', false, '160', 6, 1],\n [false, 'Jetwire', 'China', 'LL Touring Frame', '2025-02-01', '37-1531629', true, '30', 8, 5],\n [false, 'Chatterpoint', 'China', 'Long-Sleeve Logo Jersey', '2025-07-14', '25-5083429', true, '39', 7, 2],\n [false, 'Twinder', 'Egypt', \"Men's Bib-Shorts\", '2025-08-31', '04-4281278', false, '96', 6, 1],\n [false, 'Midel', 'United States', \"Men's Sports Shorts\", '2025-06-27', '55-1711908', true, '108', 10, 3],\n [false, 'Yodo', 'India', 'ML Mountain Frame', '2025-03-16', '58-8360815', false, '46', 1, 1],\n [false, 'Camido', 'Russia', 'ML Mountain Frame-W', '2025-09-13', '10-3786104', true, '97', 8, 3],\n [false, 'Eire', 'Thailand', 'ML Road Frame', '2025-04-10', '45-1186054', true, '161', 1, 4],\n [false, 'Vinte', 'United Kingdom', 'ML Road Frame-W', '2025-01-22', '62-6202742', true, '58', 4, 3],\n [false, 'Twitterlist', 'China', 'Mountain Bike Socks', '2025-11-09', '88-9646223', true, '92', 8, 3],\n [false, 'Eidel', 'Bangladesh', 'Mountain-100', '2025-09-19', '45-5588112', true, '5', 6, 5],\n [false, 'Trunyx', 'Nigeria', 'Mountain-200', '2025-03-09', '66-6271819', true, '158', 4, 1],\n [false, 'Katz', 'Turkey', 'Mountain-300', '2025-03-05', '38-9245023', false, '121', 5, 4],\n [false, 'Kaymbo', 'United States', 'Mountain-400-W', '2025-12-24', '44-5916927', false, '61', 5, 4],\n [false, 'Ozu', 'Pakistan', 'Mountain-500', '2025-06-13', '31-5449914', true, '155', 2, 2],\n [false, 'Rhynyx', 'India', 'Racing Socks', '2025-12-05', '19-9413869', true, '162', 2, 4],\n [false, 'Flashset', 'Iran', 'Road-150', '2025-12-14', '25-9807605', false, '46', 7, 1],\n [false, 'Yata', 'Congo (Kinshasa)', 'Road-250', '2025-06-12', '74-4291983', true, '47', 4, 4],\n [false, 'Brainlounge', 'Vietnam', 'Road-350-W', '2025-03-10', '83-0980643', true, '104', 2, 3],\n [false, 'Babblestorm', 'United States', 'Road-450', '2025-10-10', '19-2878430', true, '101', 6, 4],\n [false, 'Youspan', 'Brazil', 'Road-550-W', '2025-12-16', '19-1838230', true, '150', 10, 3],\n [false, 'Nlounge', 'China', 'Road-650', '2025-10-31', '32-2267938', true, '42', 4, 2],\n [false, 'Twinte', 'India', 'Road-750', '2025-08-17', '79-2821972', true, '144', 9, 3],\n [false, 'Oyonder', 'United Kingdom', 'Short-Sleeve Classic Jersey', '2025-12-04', '46-6597557', true, '195', 4, 1],\n [false, 'Gigabox', 'Pakistan', 'Sport-100', '2025-02-03', '15-1793960', true, '199', 4, 4],\n [false, 'Livetube', 'France', 'Touring-1000', '2025-05-16', '86-0811003', true, '110', 4, 5],\n [false, 'Voomm', 'United Kingdom', 'Touring-2000', '2025-07-15', '95-3068680', true, '51', 4, 4],\n [false, 'Voonyx', 'China', 'Touring-3000', '2025-11-27', '35-3085360', false, '69', 2, 5],\n [false, 'Zoombeat', 'United States', \"Women's Mountain Shorts\", '2025-11-03', '56-8673088', false, '53', 2, 3],\n [false, 'Roomm', 'China', \"Women's Tights\", '2025-03-16', '76-0085918', true, '168', 1, 1],\n [false, 'Leenti', 'China', 'Mountain-400', '2025-05-16', '03-0893276', false, '58', 1, 4],\n [false, 'Jetpulse', 'United States', 'Road-550', '2025-02-08', '79-9013306', true, '152', 9, 3],\n [false, 'Katz', 'Peru', 'Road-350', '2025-02-15', '55-7799920', true, '66', 4, 2],\n [false, 'Cogidoo', 'India', 'LL Mountain Front Wheel', '2025-06-04', '07-0881122', false, '112', 9, 2],\n [false, 'Divavu', 'Colombia', 'Touring Rear Wheel', '2025-02-24', '58-6157387', true, '50', 10, 4],\n [false, 'Mydeo', 'China', 'Touring Front Wheel', '2025-12-07', '12-2810010', false, '31', 3, 5],\n [false, 'Browsebug', 'Japan', 'ML Mountain Front Wheel', '2025-01-14', '64-9249984', true, '132', 5, 5],\n [false, 'Layo', 'China', 'HL Mountain Front Wheel', '2025-04-24', '45-0739652', true, '45', 1, 5],\n [false, 'Snaptags', 'United Kingdom', 'LL Touring Handlebars', '2025-08-06', '09-5712761', true, '197', 4, 2],\n [false, 'Cogilith', 'China', 'HL Touring Handlebars', '2025-05-31', '01-7345008', true, '190', 4, 3],\n [false, 'Reallinks', 'United Kingdom', 'LL Road Front Wheel', '2025-05-14', '62-1065350', true, '184', 3, 4],\n [false, 'Quaxo', 'United States', 'ML Road Front Wheel', '2025-03-23', '44-7241323', true, '169', 3, 4],\n [false, 'Devify', 'China', 'HL Road Front Wheel', '2025-12-12', '52-0295699', false, '152', 4, 4],\n [false, 'Youopia', 'Angola', 'LL Mountain Handlebars', '2025-04-01', '52-2650922', false, '182', 6, 4],\n [false, 'Ainyx', 'China', 'Touring Pedal', '2025-02-27', '48-3618525', true, '141', 6, 1],\n [false, 'Browsetype', 'Malaysia', 'ML Mountain Handlebars', '2025-04-28', '51-8893923', true, '169', 7, 1],\n [false, 'Muxo', 'China', 'HL Mountain Handlebars', '2025-08-22', '68-5911361', false, '39', 7, 1],\n [false, 'Bubbletube', 'China', 'LL Road Handlebars', '2025-10-04', '41-5880042', true, '71', 8, 3],\n [false, 'Fadeo', 'Vietnam', 'ML Road Handlebars', '2025-04-23', '90-5913983', true, '148', 10, 3],\n [false, 'Yadel', 'United Kingdom', 'HL Road Handlebars', '2025-04-18', '92-0960699', true, '116', 8, 1],\n [false, 'Blognation', 'China', 'LL Headset', '2025-01-10', '06-9493898', true, '96', 10, 1],\n [false, 'Devpoint', 'China', 'ML Headset', '2025-12-25', '69-5878565', true, '35', 4, 2],\n [false, 'Aibox', 'United Kingdom', 'HL Headset', '2025-03-18', '13-1133017', true, '16', 8, 2],\n [false, 'Brightdog', 'China', 'LL Mountain Pedal', '2025-09-11', '39-6530433', true, '194', 2, 5],\n [false, 'Gabcube', 'Nigeria', 'ML Mountain Pedal', '2025-04-22', '96-6860388', true, '24', 1, 3],\n [false, 'Muxo', 'China', 'HL Mountain Pedal', '2025-06-05', '30-0356137', true, '170', 4, 4],\n [false, 'Tambee', 'China', 'ML Touring Seat/Saddle', '2025-02-22', '93-9058255', true, '184', 9, 5],\n [false, 'Cogilith', 'India', 'LL Touring Seat/Saddle', '2025-04-06', '82-9268909', false, '153', 10, 4],\n [false, 'Dynabox', 'Hong Kong', 'HL Touring Seat/Saddle', '2025-01-10', '20-6913815', false, '88', 10, 1],\n [false, 'Shuffledrive', 'Sudan', 'LL Road Pedal', '2025-09-16', '08-8238817', true, '57', 9, 2],\n [false, 'Fivechat', 'China', 'ML Road Pedal', '2025-08-26', '44-7370350', false, '62', 4, 1],\n [false, 'Meembee', 'United States', 'HL Road Pedal', '2025-12-27', '01-3525949', true, '123', 2, 4],\n [false, 'Dynazzy', 'United Kingdom', 'LL Mountain Seat/Saddle 1', '2025-12-15', '04-2414623', true, '77', 10, 5],\n [false, 'Eare', 'China', 'ML Mountain Seat/Saddle 1', '2025-04-04', '15-1917509', false, '199', 9, 4],\n [false, 'Yozio', 'China', 'HL Mountain Seat/Saddle 1', '2025-03-15', '06-2526845', true, '149', 8, 2],\n [false, 'Quinu', \"Xi'an\", '425-777-7829', '2025-02-22', '83-1713558', false, '191', 9, 5],\n [false, 'Jazzy', 'United Kingdom', 'ML Road Seat/Saddle 1', '2025-08-07', '00-8892524', true, '150', 10, 2],\n [false, 'Thoughtsphere', 'China', 'HL Road Seat/Saddle 1', '2025-11-28', '39-5538991', true, '130', 7, 3],\n [false, 'Leenti', 'China', 'ML Road Rear Wheel', '2025-12-29', '06-9002973', true, '179', 1, 2],\n [false, 'Quaxo', 'United Kingdom', 'HL Road Rear Wheel', '2025-09-06', '73-6104901', true, '98', 5, 3],\n [false, 'Tanoodle', 'Chile', 'LL Mountain Seat/Saddle 2', '2025-05-24', '68-7384479', true, '175', 2, 3],\n [false, 'Feednation', 'China', 'ML Mountain Seat/Saddle 2', '2025-11-21', '26-7757763', true, '11', 1, 3],\n [false, 'Kayveo', 'China', 'HL Mountain Seat/Saddle 2', '2025-06-21', '07-4873562', false, '184', 7, 4],\n [false, 'Meevee', 'Saudi Arabia', 'LL Road Seat/Saddle 1', '2025-11-16', '46-5819554', false, '27', 9, 3],\n [false, 'Twitterworks', 'China', 'ML Road Seat/Saddle 2', '2025-04-19', '01-2666826', true, '186', 3, 2],\n [false, 'Wikizz', 'Tanzania', 'HL Road Seat/Saddle 2', '2025-03-08', '54-7090503', true, '20', 3, 3],\n [false, 'Yoveo', 'United States', 'LL Mountain Tire', '2025-10-14', '78-7658520', false, '153', 2, 1],\n [false, 'Yakidoo', 'China', 'ML Mountain Tire', '2025-10-12', '23-9926318', true, '161', 8, 5],\n [false, 'Oyope', 'China', 'HL Mountain Tire', '2025-09-20', '20-0179517', true, '98', 10, 5],\n [false, 'Skipstorm', 'United States', 'LL Road Tire', '2025-10-01', '02-9543343', true, '30', 7, 3],\n [false, 'Minyx', 'United States', 'ML Road Tire', '2025-07-07', '98-3938169', true, '73', 10, 2],\n [false, 'Miboo', 'China', 'HL Road Tire', '2025-07-25', '68-5197934', true, '158', 9, 1],\n [false, 'Realfire', 'United States', 'Touring Tire', '2025-08-27', '39-8260460', true, '122', 5, 2],\n [false, 'Shufflester', 'China', 'Mountain Tire Tube', '2025-06-08', '45-9776170', true, '33', 2, 4],\n [false, 'Ntag', 'China', 'Road Tire Tube', '2025-12-06', '45-0858451', true, '107', 6, 2],\n [false, 'Jabberbean', 'United States', 'Touring Tire Tube', '2025-04-26', '15-4247305', true, '15', 1, 2],\n [false, 'Thoughtblab', 'China', 'LL Bottom Bracket', '2025-05-21', '15-8534931', true, '168', 5, 2],\n [false, 'Jabbertype', 'China', 'Classic Vest', '2025-07-25', '23-1251557', true, '135', 4, 2],\n [false, 'Buzzshare', 'United Kingdom', 'Cycling Cap', '2025-07-07', '86-5920601', true, '11', 1, 4],\n [false, 'Roodel', 'United States', 'Full-Finger Gloves', '2025-01-13', '48-1055459', true, '41', 6, 4],\n [false, 'Zoovu', 'China', 'Half-Finger Gloves', '2025-06-03', '12-7842022', true, '144', 6, 1],\n [false, 'Photofeed', 'China', 'HL Mountain Frame', '2025-07-14', '94-5088099', true, '106', 1, 4],\n];\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(TD, row, column, _prop, _value, cellProperties) {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\nconst example = document.getElementById('example');\n\nnew Handsontable(example, {\n data,\n height: 450,\n width: '100%',\n colWidths: [180, 220, 140, 120, 120, 120, 140],\n colHeaders: ['Company Name', 'Name', 'Sell date', 'In stock', 'Quantity', 'Order ID', 'Country'],\n contextMenu: [\n 'cut',\n 'copy',\n '---------',\n 'row_above',\n 'row_below',\n 'remove_row',\n '---------',\n 'alignment',\n 'make_read_only',\n 'clear_column',\n ],\n columns: [\n { data: 1, type: 'text' },\n { data: 3, type: 'text' },\n {\n data: 4,\n type: 'intl-date',\n locale: 'en-GB',\n dateFormat: { day: '2-digit', month: '2-digit', year: 'numeric' },\n },\n {\n data: 6,\n type: 'checkbox',\n className: 'htCenter',\n },\n { data: 7, type: 'numeric' },\n { data: 5, type: 'text' },\n { data: 2, type: 'text' },\n ],\n dropdownMenu: true,\n hiddenColumns: {\n indicators: true,\n },\n multiColumnSorting: true,\n filters: true,\n rowHeaders: true,\n manualRowMove: true,\n headerClassName: 'htLeft',\n beforeRenderer: addClassesToRows,\n autoWrapRow: true,\n autoWrapCol: true,\n autoRowSize: true,\n manualRowResize: true,\n manualColumnResize: true,\n navigableHeaders: true,\n imeFastEdit: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\nconsole.log(`Handsontable: v${Handsontable.version} (${Handsontable.buildDate})`);","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/demo/javascript/example.js","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example","exampleTitle":"example","docPermalink":"/demo","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__react__example2.tsx.json index e25642c40..e8c79259f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Demo · Example 2 · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// constants.ts\nexport const data = [\n [false, 'Tagcat', 'United Kingdom', 'Classic Vest', '2025-10-11', '01-2331942', true, '172', 2, 2],\n [true, 'Zoomzone', 'Indonesia', 'Cycling Cap', '2025-05-03', '88-2768633', true, '188', 6, 2],\n [true, 'Meeveo', 'United States', 'Full-Finger Gloves', '2025-03-27', '51-6775945', true, '162', 1, 3],\n [false, 'Buzzdog', 'Philippines', 'HL Mountain Frame', '2025-08-29', '44-4028109', true, '133', 7, 1],\n [true, 'Katz', 'India', 'Half-Finger Gloves', '2025-10-02', '08-2758492', true, '87', 1, 3],\n [false, 'Jaxbean', 'China', 'HL Road Frame', '2025-09-28', '84-3557705', false, '26', 8, 1],\n [false, 'Wikido', 'Brazil', 'HL Touring Frame', '2025-06-24', '20-9397637', false, '110', 4, 1],\n [false, 'Browsedrive', 'United States', 'LL Mountain Frame', '2025-03-13', '36-0079556', true, '50', 4, 4],\n [false, 'Twinder', 'United Kingdom', 'LL Road Frame', '2025-04-06', '41-1489542', false, '160', 6, 1],\n [false, 'Jetwire', 'China', 'LL Touring Frame', '2025-02-01', '37-1531629', true, '30', 8, 5],\n [false, 'Chatterpoint', 'China', 'Long-Sleeve Logo Jersey', '2025-07-14', '25-5083429', true, '39', 7, 2],\n [false, 'Twinder', 'Egypt', \"Men's Bib-Shorts\", '2025-08-31', '04-4281278', false, '96', 6, 1],\n [false, 'Midel', 'United States', \"Men's Sports Shorts\", '2025-06-27', '55-1711908', true, '108', 10, 3],\n [false, 'Yodo', 'India', 'ML Mountain Frame', '2025-03-16', '58-8360815', false, '46', 1, 1],\n [false, 'Camido', 'Russia', 'ML Mountain Frame-W', '2025-09-13', '10-3786104', true, '97', 8, 3],\n [false, 'Eire', 'Thailand', 'ML Road Frame', '2025-04-10', '45-1186054', true, '161', 1, 4],\n [false, 'Vinte', 'United Kingdom', 'ML Road Frame-W', '2025-01-22', '62-6202742', true, '58', 4, 3],\n [false, 'Twitterlist', 'China', 'Mountain Bike Socks', '2025-11-09', '88-9646223', true, '92', 8, 3],\n [false, 'Eidel', 'Bangladesh', 'Mountain-100', '2025-09-19', '45-5588112', true, '5', 6, 5],\n [false, 'Trunyx', 'Nigeria', 'Mountain-200', '2025-03-09', '66-6271819', true, '158', 4, 1],\n [false, 'Katz', 'Turkey', 'Mountain-300', '2025-03-05', '38-9245023', false, '121', 5, 4],\n [false, 'Kaymbo', 'United States', 'Mountain-400-W', '2025-12-24', '44-5916927', false, '61', 5, 4],\n [false, 'Ozu', 'Pakistan', 'Mountain-500', '2025-06-13', '31-5449914', true, '155', 2, 2],\n [false, 'Rhynyx', 'India', 'Racing Socks', '2025-12-05', '19-9413869', true, '162', 2, 4],\n [false, 'Flashset', 'Iran', 'Road-150', '2025-12-14', '25-9807605', false, '46', 7, 1],\n [false, 'Yata', 'Congo (Kinshasa)', 'Road-250', '2025-06-12', '74-4291983', true, '47', 4, 4],\n [false, 'Brainlounge', 'Vietnam', 'Road-350-W', '2025-03-10', '83-0980643', true, '104', 2, 3],\n [false, 'Babblestorm', 'United States', 'Road-450', '2025-10-10', '19-2878430', true, '101', 6, 4],\n [false, 'Youspan', 'Brazil', 'Road-550-W', '2025-12-16', '19-1838230', true, '150', 10, 3],\n [false, 'Nlounge', 'China', 'Road-650', '2025-10-31', '32-2267938', true, '42', 4, 2],\n [false, 'Twinte', 'India', 'Road-750', '2025-08-17', '79-2821972', true, '144', 9, 3],\n [false, 'Oyonder', 'United Kingdom', 'Short-Sleeve Classic Jersey', '2025-12-04', '46-6597557', true, '195', 4, 1],\n [false, 'Gigabox', 'Pakistan', 'Sport-100', '2025-02-03', '15-1793960', true, '199', 4, 4],\n [false, 'Livetube', 'France', 'Touring-1000', '2025-05-16', '86-0811003', true, '110', 4, 5],\n [false, 'Voomm', 'United Kingdom', 'Touring-2000', '2025-07-15', '95-3068680', true, '51', 4, 4],\n [false, 'Voonyx', 'China', 'Touring-3000', '2025-11-27', '35-3085360', false, '69', 2, 5],\n [false, 'Zoombeat', 'United States', \"Women's Mountain Shorts\", '2025-11-03', '56-8673088', false, '53', 2, 3],\n [false, 'Roomm', 'China', \"Women's Tights\", '2025-03-16', '76-0085918', true, '168', 1, 1],\n [false, 'Leenti', 'China', 'Mountain-400', '2025-05-16', '03-0893276', false, '58', 1, 4],\n [false, 'Jetpulse', 'United States', 'Road-550', '2025-02-08', '79-9013306', true, '152', 9, 3],\n [false, 'Katz', 'Peru', 'Road-350', '2025-02-15', '55-7799920', true, '66', 4, 2],\n [false, 'Cogidoo', 'India', 'LL Mountain Front Wheel', '2025-06-04', '07-0881122', false, '112', 9, 2],\n [false, 'Divavu', 'Colombia', 'Touring Rear Wheel', '2025-02-24', '58-6157387', true, '50', 10, 4],\n [false, 'Mydeo', 'China', 'Touring Front Wheel', '2025-12-07', '12-2810010', false, '31', 3, 5],\n [false, 'Browsebug', 'Japan', 'ML Mountain Front Wheel', '2025-01-14', '64-9249984', true, '132', 5, 5],\n [false, 'Layo', 'China', 'HL Mountain Front Wheel', '2025-04-24', '45-0739652', true, '45', 1, 5],\n [false, 'Snaptags', 'United Kingdom', 'LL Touring Handlebars', '2025-08-06', '09-5712761', true, '197', 4, 2],\n [false, 'Cogilith', 'China', 'HL Touring Handlebars', '2025-05-31', '01-7345008', true, '190', 4, 3],\n [false, 'Reallinks', 'United Kingdom', 'LL Road Front Wheel', '2025-05-14', '62-1065350', true, '184', 3, 4],\n [false, 'Quaxo', 'United States', 'ML Road Front Wheel', '2025-03-23', '44-7241323', true, '169', 3, 4],\n [false, 'Devify', 'China', 'HL Road Front Wheel', '2025-12-12', '52-0295699', false, '152', 4, 4],\n [false, 'Youopia', 'Angola', 'LL Mountain Handlebars', '2025-04-01', '52-2650922', false, '182', 6, 4],\n [false, 'Ainyx', 'China', 'Touring Pedal', '2025-02-27', '48-3618525', true, '141', 6, 1],\n [false, 'Browsetype', 'Malaysia', 'ML Mountain Handlebars', '2025-04-28', '51-8893923', true, '169', 7, 1],\n [false, 'Muxo', 'China', 'HL Mountain Handlebars', '2025-08-22', '68-5911361', false, '39', 7, 1],\n [false, 'Bubbletube', 'China', 'LL Road Handlebars', '2025-10-04', '41-5880042', true, '71', 8, 3],\n [false, 'Fadeo', 'Vietnam', 'ML Road Handlebars', '2025-04-23', '90-5913983', true, '148', 10, 3],\n [false, 'Yadel', 'United Kingdom', 'HL Road Handlebars', '2025-04-18', '92-0960699', true, '116', 8, 1],\n [false, 'Blognation', 'China', 'LL Headset', '2025-01-10', '06-9493898', true, '96', 10, 1],\n [false, 'Devpoint', 'China', 'ML Headset', '2025-12-25', '69-5878565', true, '35', 4, 2],\n [false, 'Aibox', 'United Kingdom', 'HL Headset', '2025-03-18', '13-1133017', true, '16', 8, 2],\n [false, 'Brightdog', 'China', 'LL Mountain Pedal', '2025-09-11', '39-6530433', true, '194', 2, 5],\n [false, 'Gabcube', 'Nigeria', 'ML Mountain Pedal', '2025-04-22', '96-6860388', true, '24', 1, 3],\n [false, 'Muxo', 'China', 'HL Mountain Pedal', '2025-06-05', '30-0356137', true, '170', 4, 4],\n [false, 'Tambee', 'China', 'ML Touring Seat/Saddle', '2025-02-22', '93-9058255', true, '184', 9, 5],\n [false, 'Cogilith', 'India', 'LL Touring Seat/Saddle', '2025-04-06', '82-9268909', false, '153', 10, 4],\n [false, 'Dynabox', 'Hong Kong', 'HL Touring Seat/Saddle', '2025-01-10', '20-6913815', false, '88', 10, 1],\n [false, 'Shuffledrive', 'Sudan', 'LL Road Pedal', '2025-09-16', '08-8238817', true, '57', 9, 2],\n [false, 'Fivechat', 'China', 'ML Road Pedal', '2025-08-26', '44-7370350', false, '62', 4, 1],\n [false, 'Meembee', 'United States', 'HL Road Pedal', '2025-12-27', '01-3525949', true, '123', 2, 4],\n [false, 'Dynazzy', 'United Kingdom', 'LL Mountain Seat/Saddle 1', '2025-12-15', '04-2414623', true, '77', 10, 5],\n [false, 'Eare', 'China', 'ML Mountain Seat/Saddle 1', '2025-04-04', '15-1917509', false, '199', 9, 4],\n [false, 'Yozio', 'China', 'HL Mountain Seat/Saddle 1', '2025-03-15', '06-2526845', true, '149', 8, 2],\n [false, 'Quinu', \"Xi'an\", '425-777-7829', '2025-02-22', '83-1713558', false, '191', 9, 5],\n [false, 'Jazzy', 'United Kingdom', 'ML Road Seat/Saddle 1', '2025-08-07', '00-8892524', true, '150', 10, 2],\n [false, 'Thoughtsphere', 'China', 'HL Road Seat/Saddle 1', '2025-11-28', '39-5538991', true, '130', 7, 3],\n [false, 'Leenti', 'China', 'ML Road Rear Wheel', '2025-12-29', '06-9002973', true, '179', 1, 2],\n [false, 'Quaxo', 'United Kingdom', 'HL Road Rear Wheel', '2025-09-06', '73-6104901', true, '98', 5, 3],\n [false, 'Tanoodle', 'Chile', 'LL Mountain Seat/Saddle 2', '2025-05-24', '68-7384479', true, '175', 2, 3],\n [false, 'Feednation', 'China', 'ML Mountain Seat/Saddle 2', '2025-11-21', '26-7757763', true, '11', 1, 3],\n [false, 'Kayveo', 'China', 'HL Mountain Seat/Saddle 2', '2025-06-21', '07-4873562', false, '184', 7, 4],\n [false, 'Meevee', 'Saudi Arabia', 'LL Road Seat/Saddle 1', '2025-11-16', '46-5819554', false, '27', 9, 3],\n [false, 'Twitterworks', 'China', 'ML Road Seat/Saddle 2', '2025-04-19', '01-2666826', true, '186', 3, 2],\n [false, 'Wikizz', 'Tanzania', 'HL Road Seat/Saddle 2', '2025-03-08', '54-7090503', true, '20', 3, 3],\n [false, 'Yoveo', 'United States', 'LL Mountain Tire', '2025-10-14', '78-7658520', false, '153', 2, 1],\n [false, 'Yakidoo', 'China', 'ML Mountain Tire', '2025-10-12', '23-9926318', true, '161', 8, 5],\n [false, 'Oyope', 'China', 'HL Mountain Tire', '2025-09-20', '20-0179517', true, '98', 10, 5],\n [false, 'Skipstorm', 'United States', 'LL Road Tire', '2025-10-01', '02-9543343', true, '30', 7, 3],\n [false, 'Minyx', 'United States', 'ML Road Tire', '2025-07-07', '98-3938169', true, '73', 10, 2],\n [false, 'Miboo', 'China', 'HL Road Tire', '2025-07-25', '68-5197934', true, '158', 9, 1],\n [false, 'Realfire', 'United States', 'Touring Tire', '2025-08-27', '39-8260460', true, '122', 5, 2],\n [false, 'Shufflester', 'China', 'Mountain Tire Tube', '2025-06-08', '45-9776170', true, '33', 2, 4],\n [false, 'Ntag', 'China', 'Road Tire Tube', '2025-12-06', '45-0858451', true, '107', 6, 2],\n [false, 'Jabberbean', 'United States', 'Touring Tire Tube', '2025-04-26', '15-4247305', true, '15', 1, 2],\n [false, 'Thoughtblab', 'China', 'LL Bottom Bracket', '2025-05-21', '15-8534931', true, '168', 5, 2],\n [false, 'Jabbertype', 'China', 'Classic Vest', '2025-07-25', '23-1251557', true, '135', 4, 2],\n [false, 'Buzzshare', 'United Kingdom', 'Cycling Cap', '2025-07-07', '86-5920601', true, '11', 1, 4],\n [false, 'Roodel', 'United States', 'Full-Finger Gloves', '2025-01-13', '48-1055459', true, '41', 6, 4],\n [false, 'Zoovu', 'China', 'Half-Finger Gloves', '2025-06-03', '12-7842022', true, '144', 6, 1],\n [false, 'Photofeed', 'China', 'HL Mountain Frame', '2025-07-14', '94-5088099', true, '106', 1, 4],\n];\n\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(\n TD: HTMLTableCellElement,\n row: number,\n column: number,\n _prop: string | number,\n _value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n): void {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\nconst App = () => {\n return (\n \n \n \n \n \n \n \n \n
\n );\n};\n\nexport default App;","/src/styles.css":""},"docsPath":"guides/getting-started/demo/react/example2.tsx","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example2","exampleTitle":"Example 2","docPermalink":"/demo","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Demo · Example 2 · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
\n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// constants.ts\nexport const data = [\n [false, 'Tagcat', 'United Kingdom', 'Classic Vest', '2025-10-11', '01-2331942', true, '172', 2, 2],\n [true, 'Zoomzone', 'Indonesia', 'Cycling Cap', '2025-05-03', '88-2768633', true, '188', 6, 2],\n [true, 'Meeveo', 'United States', 'Full-Finger Gloves', '2025-03-27', '51-6775945', true, '162', 1, 3],\n [false, 'Buzzdog', 'Philippines', 'HL Mountain Frame', '2025-08-29', '44-4028109', true, '133', 7, 1],\n [true, 'Katz', 'India', 'Half-Finger Gloves', '2025-10-02', '08-2758492', true, '87', 1, 3],\n [false, 'Jaxbean', 'China', 'HL Road Frame', '2025-09-28', '84-3557705', false, '26', 8, 1],\n [false, 'Wikido', 'Brazil', 'HL Touring Frame', '2025-06-24', '20-9397637', false, '110', 4, 1],\n [false, 'Browsedrive', 'United States', 'LL Mountain Frame', '2025-03-13', '36-0079556', true, '50', 4, 4],\n [false, 'Twinder', 'United Kingdom', 'LL Road Frame', '2025-04-06', '41-1489542', false, '160', 6, 1],\n [false, 'Jetwire', 'China', 'LL Touring Frame', '2025-02-01', '37-1531629', true, '30', 8, 5],\n [false, 'Chatterpoint', 'China', 'Long-Sleeve Logo Jersey', '2025-07-14', '25-5083429', true, '39', 7, 2],\n [false, 'Twinder', 'Egypt', \"Men's Bib-Shorts\", '2025-08-31', '04-4281278', false, '96', 6, 1],\n [false, 'Midel', 'United States', \"Men's Sports Shorts\", '2025-06-27', '55-1711908', true, '108', 10, 3],\n [false, 'Yodo', 'India', 'ML Mountain Frame', '2025-03-16', '58-8360815', false, '46', 1, 1],\n [false, 'Camido', 'Russia', 'ML Mountain Frame-W', '2025-09-13', '10-3786104', true, '97', 8, 3],\n [false, 'Eire', 'Thailand', 'ML Road Frame', '2025-04-10', '45-1186054', true, '161', 1, 4],\n [false, 'Vinte', 'United Kingdom', 'ML Road Frame-W', '2025-01-22', '62-6202742', true, '58', 4, 3],\n [false, 'Twitterlist', 'China', 'Mountain Bike Socks', '2025-11-09', '88-9646223', true, '92', 8, 3],\n [false, 'Eidel', 'Bangladesh', 'Mountain-100', '2025-09-19', '45-5588112', true, '5', 6, 5],\n [false, 'Trunyx', 'Nigeria', 'Mountain-200', '2025-03-09', '66-6271819', true, '158', 4, 1],\n [false, 'Katz', 'Turkey', 'Mountain-300', '2025-03-05', '38-9245023', false, '121', 5, 4],\n [false, 'Kaymbo', 'United States', 'Mountain-400-W', '2025-12-24', '44-5916927', false, '61', 5, 4],\n [false, 'Ozu', 'Pakistan', 'Mountain-500', '2025-06-13', '31-5449914', true, '155', 2, 2],\n [false, 'Rhynyx', 'India', 'Racing Socks', '2025-12-05', '19-9413869', true, '162', 2, 4],\n [false, 'Flashset', 'Iran', 'Road-150', '2025-12-14', '25-9807605', false, '46', 7, 1],\n [false, 'Yata', 'Congo (Kinshasa)', 'Road-250', '2025-06-12', '74-4291983', true, '47', 4, 4],\n [false, 'Brainlounge', 'Vietnam', 'Road-350-W', '2025-03-10', '83-0980643', true, '104', 2, 3],\n [false, 'Babblestorm', 'United States', 'Road-450', '2025-10-10', '19-2878430', true, '101', 6, 4],\n [false, 'Youspan', 'Brazil', 'Road-550-W', '2025-12-16', '19-1838230', true, '150', 10, 3],\n [false, 'Nlounge', 'China', 'Road-650', '2025-10-31', '32-2267938', true, '42', 4, 2],\n [false, 'Twinte', 'India', 'Road-750', '2025-08-17', '79-2821972', true, '144', 9, 3],\n [false, 'Oyonder', 'United Kingdom', 'Short-Sleeve Classic Jersey', '2025-12-04', '46-6597557', true, '195', 4, 1],\n [false, 'Gigabox', 'Pakistan', 'Sport-100', '2025-02-03', '15-1793960', true, '199', 4, 4],\n [false, 'Livetube', 'France', 'Touring-1000', '2025-05-16', '86-0811003', true, '110', 4, 5],\n [false, 'Voomm', 'United Kingdom', 'Touring-2000', '2025-07-15', '95-3068680', true, '51', 4, 4],\n [false, 'Voonyx', 'China', 'Touring-3000', '2025-11-27', '35-3085360', false, '69', 2, 5],\n [false, 'Zoombeat', 'United States', \"Women's Mountain Shorts\", '2025-11-03', '56-8673088', false, '53', 2, 3],\n [false, 'Roomm', 'China', \"Women's Tights\", '2025-03-16', '76-0085918', true, '168', 1, 1],\n [false, 'Leenti', 'China', 'Mountain-400', '2025-05-16', '03-0893276', false, '58', 1, 4],\n [false, 'Jetpulse', 'United States', 'Road-550', '2025-02-08', '79-9013306', true, '152', 9, 3],\n [false, 'Katz', 'Peru', 'Road-350', '2025-02-15', '55-7799920', true, '66', 4, 2],\n [false, 'Cogidoo', 'India', 'LL Mountain Front Wheel', '2025-06-04', '07-0881122', false, '112', 9, 2],\n [false, 'Divavu', 'Colombia', 'Touring Rear Wheel', '2025-02-24', '58-6157387', true, '50', 10, 4],\n [false, 'Mydeo', 'China', 'Touring Front Wheel', '2025-12-07', '12-2810010', false, '31', 3, 5],\n [false, 'Browsebug', 'Japan', 'ML Mountain Front Wheel', '2025-01-14', '64-9249984', true, '132', 5, 5],\n [false, 'Layo', 'China', 'HL Mountain Front Wheel', '2025-04-24', '45-0739652', true, '45', 1, 5],\n [false, 'Snaptags', 'United Kingdom', 'LL Touring Handlebars', '2025-08-06', '09-5712761', true, '197', 4, 2],\n [false, 'Cogilith', 'China', 'HL Touring Handlebars', '2025-05-31', '01-7345008', true, '190', 4, 3],\n [false, 'Reallinks', 'United Kingdom', 'LL Road Front Wheel', '2025-05-14', '62-1065350', true, '184', 3, 4],\n [false, 'Quaxo', 'United States', 'ML Road Front Wheel', '2025-03-23', '44-7241323', true, '169', 3, 4],\n [false, 'Devify', 'China', 'HL Road Front Wheel', '2025-12-12', '52-0295699', false, '152', 4, 4],\n [false, 'Youopia', 'Angola', 'LL Mountain Handlebars', '2025-04-01', '52-2650922', false, '182', 6, 4],\n [false, 'Ainyx', 'China', 'Touring Pedal', '2025-02-27', '48-3618525', true, '141', 6, 1],\n [false, 'Browsetype', 'Malaysia', 'ML Mountain Handlebars', '2025-04-28', '51-8893923', true, '169', 7, 1],\n [false, 'Muxo', 'China', 'HL Mountain Handlebars', '2025-08-22', '68-5911361', false, '39', 7, 1],\n [false, 'Bubbletube', 'China', 'LL Road Handlebars', '2025-10-04', '41-5880042', true, '71', 8, 3],\n [false, 'Fadeo', 'Vietnam', 'ML Road Handlebars', '2025-04-23', '90-5913983', true, '148', 10, 3],\n [false, 'Yadel', 'United Kingdom', 'HL Road Handlebars', '2025-04-18', '92-0960699', true, '116', 8, 1],\n [false, 'Blognation', 'China', 'LL Headset', '2025-01-10', '06-9493898', true, '96', 10, 1],\n [false, 'Devpoint', 'China', 'ML Headset', '2025-12-25', '69-5878565', true, '35', 4, 2],\n [false, 'Aibox', 'United Kingdom', 'HL Headset', '2025-03-18', '13-1133017', true, '16', 8, 2],\n [false, 'Brightdog', 'China', 'LL Mountain Pedal', '2025-09-11', '39-6530433', true, '194', 2, 5],\n [false, 'Gabcube', 'Nigeria', 'ML Mountain Pedal', '2025-04-22', '96-6860388', true, '24', 1, 3],\n [false, 'Muxo', 'China', 'HL Mountain Pedal', '2025-06-05', '30-0356137', true, '170', 4, 4],\n [false, 'Tambee', 'China', 'ML Touring Seat/Saddle', '2025-02-22', '93-9058255', true, '184', 9, 5],\n [false, 'Cogilith', 'India', 'LL Touring Seat/Saddle', '2025-04-06', '82-9268909', false, '153', 10, 4],\n [false, 'Dynabox', 'Hong Kong', 'HL Touring Seat/Saddle', '2025-01-10', '20-6913815', false, '88', 10, 1],\n [false, 'Shuffledrive', 'Sudan', 'LL Road Pedal', '2025-09-16', '08-8238817', true, '57', 9, 2],\n [false, 'Fivechat', 'China', 'ML Road Pedal', '2025-08-26', '44-7370350', false, '62', 4, 1],\n [false, 'Meembee', 'United States', 'HL Road Pedal', '2025-12-27', '01-3525949', true, '123', 2, 4],\n [false, 'Dynazzy', 'United Kingdom', 'LL Mountain Seat/Saddle 1', '2025-12-15', '04-2414623', true, '77', 10, 5],\n [false, 'Eare', 'China', 'ML Mountain Seat/Saddle 1', '2025-04-04', '15-1917509', false, '199', 9, 4],\n [false, 'Yozio', 'China', 'HL Mountain Seat/Saddle 1', '2025-03-15', '06-2526845', true, '149', 8, 2],\n [false, 'Quinu', \"Xi'an\", '425-777-7829', '2025-02-22', '83-1713558', false, '191', 9, 5],\n [false, 'Jazzy', 'United Kingdom', 'ML Road Seat/Saddle 1', '2025-08-07', '00-8892524', true, '150', 10, 2],\n [false, 'Thoughtsphere', 'China', 'HL Road Seat/Saddle 1', '2025-11-28', '39-5538991', true, '130', 7, 3],\n [false, 'Leenti', 'China', 'ML Road Rear Wheel', '2025-12-29', '06-9002973', true, '179', 1, 2],\n [false, 'Quaxo', 'United Kingdom', 'HL Road Rear Wheel', '2025-09-06', '73-6104901', true, '98', 5, 3],\n [false, 'Tanoodle', 'Chile', 'LL Mountain Seat/Saddle 2', '2025-05-24', '68-7384479', true, '175', 2, 3],\n [false, 'Feednation', 'China', 'ML Mountain Seat/Saddle 2', '2025-11-21', '26-7757763', true, '11', 1, 3],\n [false, 'Kayveo', 'China', 'HL Mountain Seat/Saddle 2', '2025-06-21', '07-4873562', false, '184', 7, 4],\n [false, 'Meevee', 'Saudi Arabia', 'LL Road Seat/Saddle 1', '2025-11-16', '46-5819554', false, '27', 9, 3],\n [false, 'Twitterworks', 'China', 'ML Road Seat/Saddle 2', '2025-04-19', '01-2666826', true, '186', 3, 2],\n [false, 'Wikizz', 'Tanzania', 'HL Road Seat/Saddle 2', '2025-03-08', '54-7090503', true, '20', 3, 3],\n [false, 'Yoveo', 'United States', 'LL Mountain Tire', '2025-10-14', '78-7658520', false, '153', 2, 1],\n [false, 'Yakidoo', 'China', 'ML Mountain Tire', '2025-10-12', '23-9926318', true, '161', 8, 5],\n [false, 'Oyope', 'China', 'HL Mountain Tire', '2025-09-20', '20-0179517', true, '98', 10, 5],\n [false, 'Skipstorm', 'United States', 'LL Road Tire', '2025-10-01', '02-9543343', true, '30', 7, 3],\n [false, 'Minyx', 'United States', 'ML Road Tire', '2025-07-07', '98-3938169', true, '73', 10, 2],\n [false, 'Miboo', 'China', 'HL Road Tire', '2025-07-25', '68-5197934', true, '158', 9, 1],\n [false, 'Realfire', 'United States', 'Touring Tire', '2025-08-27', '39-8260460', true, '122', 5, 2],\n [false, 'Shufflester', 'China', 'Mountain Tire Tube', '2025-06-08', '45-9776170', true, '33', 2, 4],\n [false, 'Ntag', 'China', 'Road Tire Tube', '2025-12-06', '45-0858451', true, '107', 6, 2],\n [false, 'Jabberbean', 'United States', 'Touring Tire Tube', '2025-04-26', '15-4247305', true, '15', 1, 2],\n [false, 'Thoughtblab', 'China', 'LL Bottom Bracket', '2025-05-21', '15-8534931', true, '168', 5, 2],\n [false, 'Jabbertype', 'China', 'Classic Vest', '2025-07-25', '23-1251557', true, '135', 4, 2],\n [false, 'Buzzshare', 'United Kingdom', 'Cycling Cap', '2025-07-07', '86-5920601', true, '11', 1, 4],\n [false, 'Roodel', 'United States', 'Full-Finger Gloves', '2025-01-13', '48-1055459', true, '41', 6, 4],\n [false, 'Zoovu', 'China', 'Half-Finger Gloves', '2025-06-03', '12-7842022', true, '144', 6, 1],\n [false, 'Photofeed', 'China', 'HL Mountain Frame', '2025-07-14', '94-5088099', true, '106', 1, 4],\n];\n\nexport const SELECTED_CLASS = 'selected';\n\nexport function addClassesToRows(\n TD: HTMLTableCellElement,\n row: number,\n column: number,\n _prop: string | number,\n _value: Handsontable.CellValue,\n cellProperties: Handsontable.CellProperties\n): void {\n // Adding classes to `TR` just while rendering first visible `TD` element\n if (column !== 0) {\n return;\n }\n\n const parentElement = TD.parentElement;\n\n if (parentElement === null) {\n return;\n }\n\n // Add class to selected rows\n if (cellProperties.instance.getDataAtRowProp(row, '0')) {\n parentElement.classList.add(SELECTED_CLASS);\n } else {\n parentElement.classList.remove(SELECTED_CLASS);\n }\n}\n\nconst App = () => {\n return (\n \n \n \n \n \n \n \n \n
\n );\n};\n\nexport default App;","/src/styles.css":""},"docsPath":"guides/getting-started/demo/react/example2.tsx","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example2","exampleTitle":"Example 2","docPermalink":"/demo","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__vue__example3.vue.json index 3ce1abb22..e9602ee17 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__demo__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Demo · Example 3 · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/demo/vue/example3.vue","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example3","exampleTitle":"Example 3","docPermalink":"/demo","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Demo · Example 3 · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
\n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/demo/vue/example3.vue","breadcrumb":["Getting Started","Demo"],"guide":"guides/getting-started/demo/demo.md","guideTitle":"Demo","exampleId":"example3","exampleTitle":"Example 3","docPermalink":"/demo","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example2.ts.json index 9b386a759..82b1b6a19 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-events-hooks',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n lastChange: string | any[] | null = null;\n\n data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange: (changes: any, source: any) => {\n this.lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n beforeKeyDown: (e) => {\n const selection = hot?.getSelected()?.[0];\n\n if (!selection) return undefined;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return undefined;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n this.lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (\n this.lastChange &&\n this.lastChange.length === 1 &&\n this.lastChange[0][2] == this.lastChange[0][3]\n ) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n this.lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n this.lastChange = null;\n\n return undefined;\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/events-and-hooks/angular/example2.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { AfterViewInit, Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-events-hooks',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n \n
`,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n lastChange: string | any[] | null = null;\n\n data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange: (changes: any, source: any) => {\n this.lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.updateSettings({\n beforeKeyDown: (e) => {\n const selection = hot?.getSelected()?.[0];\n\n if (!selection) return undefined;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return undefined;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n this.lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (\n this.lastChange &&\n this.lastChange.length === 1 &&\n this.lastChange[0][2] == this.lastChange[0][3]\n ) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n this.lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n this.lastChange = null;\n\n return undefined;\n },\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/events-and-hooks/angular/example2.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example3.ts.json index 4fcb2c344..b244cd68e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Events and hooks · External control · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-events-hooks',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n\n \n
\n\n \n
\n\n \n
\n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3', 'K3', 'L3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4', 'K4', 'L4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5', 'K5', 'L5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6', 'K6', 'L6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7', 'J7', 'K7', 'L7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8', 'K8', 'L8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9', 'J9', 'K9', 'L9'],\n [\n 'A10',\n 'B10',\n 'C10',\n 'D10',\n 'E10',\n 'F10',\n 'G10',\n 'H10',\n 'I10',\n 'J10',\n 'K10',\n 'L11',\n ],\n [\n 'A11',\n 'B11',\n 'C11',\n 'D11',\n 'E11',\n 'F11',\n 'G11',\n 'H11',\n 'I11',\n 'J11',\n 'K11',\n 'L11',\n ],\n [\n 'A12',\n 'B12',\n 'C12',\n 'D12',\n 'E12',\n 'F12',\n 'G12',\n 'H12',\n 'I12',\n 'J12',\n 'K12',\n 'L12',\n ],\n ];\n readonly initialState = {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 240\n };\n\n handleChange(\n setting: string,\n states: number[] | boolean[],\n event: Event\n ): void {\n const target = event.target as HTMLInputElement;\n\n this.hotTable.hotInstance?.updateSettings({\n [setting]: states[target.checked ? 1 : 0],\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/events-and-hooks/angular/example3.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Events and hooks · External control · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
\n \n
\n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-events-hooks',\n standalone: true,\n imports: [HotTableModule],\n template: `
\n
\n \n
\n\n \n
\n\n \n
\n\n \n
\n
\n
\n
\n \n
`,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3', 'K3', 'L3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4', 'K4', 'L4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5', 'K5', 'L5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6', 'K6', 'L6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7', 'J7', 'K7', 'L7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8', 'K8', 'L8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9', 'J9', 'K9', 'L9'],\n [\n 'A10',\n 'B10',\n 'C10',\n 'D10',\n 'E10',\n 'F10',\n 'G10',\n 'H10',\n 'I10',\n 'J10',\n 'K10',\n 'L11',\n ],\n [\n 'A11',\n 'B11',\n 'C11',\n 'D11',\n 'E11',\n 'F11',\n 'G11',\n 'H11',\n 'I11',\n 'J11',\n 'K11',\n 'L11',\n ],\n [\n 'A12',\n 'B12',\n 'C12',\n 'D12',\n 'E12',\n 'F12',\n 'G12',\n 'H12',\n 'I12',\n 'J12',\n 'K12',\n 'L12',\n ],\n ];\n readonly initialState = {\n autoWrapRow: true,\n autoWrapCol: true,\n height: 240\n };\n\n handleChange(\n setting: string,\n states: number[] | boolean[],\n event: Event\n ): void {\n const target = event.target as HTMLInputElement;\n\n this.hotTable.hotInstance?.updateSettings({\n [setting]: states[target.checked ? 1 : 0],\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/events-and-hooks/angular/example3.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example1.js.json index dd390fd04..656665b28 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Events and hooks · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
\n
\n
\n
\n
\n \n Choose events to be logged:\n
    \n
  • \n \n
  • \n
\n
\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst config = {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n minRows: 5,\n minCols: 5,\n height: 'auto',\n stretchH: 'all',\n minSpareRows: 1,\n autoWrapRow: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n contextMenu: true,\n autoWrapCol: true,\n dropdownMenu: true,\n filters: true,\n columnSorting: true,\n mergeCells: true,\n comments: true,\n manualColumnMove: true,\n manualRowMove: true,\n moveCells: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst example1Events = document.getElementById('example1_events');\nconst hooksList = document.getElementById('hooksList');\nconst hooks = Handsontable.hooks.getRegistered();\n\nhooks.forEach((hook) => {\n let checked = '';\n\n if (\n hook === 'afterChange' ||\n hook === 'afterSelection' ||\n hook === 'afterCreateRow' ||\n hook === 'afterRemoveRow' ||\n hook === 'afterCreateCol' ||\n hook === 'afterRemoveCol'\n ) {\n checked = 'checked';\n }\n\n hooksList.innerHTML += `
  • `;\n config[hook] = function () {\n log_events(hook, arguments);\n };\n});\n\nconst start = new Date().getTime();\nlet i = 0;\nlet timer;\n\n/**\n * @param event\n * @param data\n */\nfunction log_events(event, data) {\n if (document.getElementById(`check_${event}`).checked) {\n const now = new Date().getTime();\n const diff = now - start;\n let str;\n const vals = [i, `@${(diff / 1000).toFixed(3)}`, `[${event}]`];\n\n for (let d = 0; d < data.length; d++) {\n try {\n str = JSON.stringify(data[d]);\n } catch (e) {\n str = data[d].toString();\n }\n\n if (str === undefined) {\n continue;\n }\n\n if (str.length > 20) {\n str = typeof data[d] === 'object' ? `object: ${str.substr(0, 20)}...}` : str.toString();\n }\n\n if (d < data.length - 1) {\n str += ',';\n }\n\n vals.push(str);\n }\n\n if (window.console) {\n console.log(i, `@${(diff / 1000).toFixed(3)}`, `[${event}]`, data);\n }\n\n const div = document.createElement('div');\n const text = document.createTextNode(vals.join(' '));\n\n div.appendChild(text);\n\n example1Events.appendChild(div);\n\n clearTimeout(timer);\n\n timer = setTimeout(() => {\n example1Events.scrollTop = example1Events.scrollHeight;\n }, 10);\n\n i++;\n }\n}\n\nconst example1 = document.querySelector('#example1');\n\nnew Handsontable(example1, config);\n\ndocument.querySelector('#check_select_all').addEventListener('click', function () {\n const state = this.checked;\n const inputs = document.querySelectorAll('#hooksList input[type=checkbox]');\n\n Array.prototype.forEach.call(inputs, (input) => {\n input.checked = state;\n });\n});\n\ndocument.querySelector('#hooksList input[type=checkbox]').addEventListener('click', function () {\n if (!this.checked) {\n document.getElementById('check_select_all').checked = false;\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example1.js","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/events-and-hooks","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Events and hooks · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n
    \n
    \n
    \n \n Choose events to be logged:\n
      \n
    • \n \n
    • \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst config = {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n minRows: 5,\n minCols: 5,\n height: 'auto',\n stretchH: 'all',\n minSpareRows: 1,\n autoWrapRow: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n contextMenu: true,\n autoWrapCol: true,\n dropdownMenu: true,\n filters: true,\n columnSorting: true,\n mergeCells: true,\n comments: true,\n manualColumnMove: true,\n manualRowMove: true,\n moveCells: true,\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst example1Events = document.getElementById('example1_events');\nconst hooksList = document.getElementById('hooksList');\nconst hooks = Handsontable.hooks.getRegistered();\n\nhooks.forEach((hook) => {\n let checked = '';\n\n if (\n hook === 'afterChange' ||\n hook === 'afterSelection' ||\n hook === 'afterCreateRow' ||\n hook === 'afterRemoveRow' ||\n hook === 'afterCreateCol' ||\n hook === 'afterRemoveCol'\n ) {\n checked = 'checked';\n }\n\n hooksList.innerHTML += `
  • `;\n config[hook] = function () {\n log_events(hook, arguments);\n };\n});\n\nconst start = new Date().getTime();\nlet i = 0;\nlet timer;\n\n/**\n * @param event\n * @param data\n */\nfunction log_events(event, data) {\n if (document.getElementById(`check_${event}`).checked) {\n const now = new Date().getTime();\n const diff = now - start;\n let str;\n const vals = [i, `@${(diff / 1000).toFixed(3)}`, `[${event}]`];\n\n for (let d = 0; d < data.length; d++) {\n try {\n str = JSON.stringify(data[d]);\n } catch (e) {\n str = data[d].toString();\n }\n\n if (str === undefined) {\n continue;\n }\n\n if (str.length > 20) {\n str = typeof data[d] === 'object' ? `object: ${str.substr(0, 20)}...}` : str.toString();\n }\n\n if (d < data.length - 1) {\n str += ',';\n }\n\n vals.push(str);\n }\n\n if (window.console) {\n console.log(i, `@${(diff / 1000).toFixed(3)}`, `[${event}]`, data);\n }\n\n const div = document.createElement('div');\n const text = document.createTextNode(vals.join(' '));\n\n div.appendChild(text);\n\n example1Events.appendChild(div);\n\n clearTimeout(timer);\n\n timer = setTimeout(() => {\n example1Events.scrollTop = example1Events.scrollHeight;\n }, 10);\n\n i++;\n }\n}\n\nconst example1 = document.querySelector('#example1');\n\nnew Handsontable(example1, config);\n\ndocument.querySelector('#check_select_all').addEventListener('click', function () {\n const state = this.checked;\n const inputs = document.querySelectorAll('#hooksList input[type=checkbox]');\n\n Array.prototype.forEach.call(inputs, (input) => {\n input.checked = state;\n });\n});\n\ndocument.querySelector('#hooksList input[type=checkbox]').addEventListener('click', function () {\n if (!this.checked) {\n document.getElementById('check_select_all').checked = false;\n }\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example1.js","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/events-and-hooks","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.js.json index 9199a06b4..7b9c9ed8b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet lastChange = null;\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange(changes) {\n lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n beforeKeyDown(e) {\n const selected = hot.getSelected();\n\n if (!selected) return;\n\n const selection = selected[0];\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(\n selection[0],\n selection[1],\n shiftedUp.map((value) => [value]),\n );\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0][2] == lastChange[0][3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(\n selection[0],\n selection[1],\n shiftedDown.map((value) => [value]),\n );\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example2.js","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet lastChange = null;\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange(changes) {\n lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n beforeKeyDown(e) {\n const selected = hot.getSelected();\n\n if (!selected) return;\n\n const selection = selected[0];\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(\n selection[0],\n selection[1],\n shiftedUp.map((value) => [value]),\n );\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0][2] == lastChange[0][3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(\n selection[0],\n selection[1],\n shiftedDown.map((value) => [value]),\n );\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example2.js","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.ts.json index 270ac5824..8e3821a47 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet lastChange: (Handsontable.CellChange | null)[] | null = null;\nconst container = document.querySelector('#example2')!;\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange(changes) {\n lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n beforeKeyDown(e) {\n const selected = hot.getSelected();\n\n if (!selected) return;\n\n const selection = selected[0]!;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0]![2] == lastChange[0]![3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example2.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet lastChange: (Handsontable.CellChange | null)[] | null = null;\nconst container = document.querySelector('#example2')!;\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Warehouse'],\n rowHeaders: true,\n height: 'auto',\n minSpareRows: 1,\n beforeChange(changes) {\n lastChange = changes;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nhot.updateSettings({\n beforeKeyDown(e) {\n const selected = hot.getSelected();\n\n if (!selected) return;\n\n const selection = selected[0]!;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0]![2] == lastChange[0]![3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/events-and-hooks/javascript/example2.ts","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example2.tsx.json index 392a697b9..41babb3a0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n let lastChange: string | any[] | null = null;\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n beforeKeyDown(e) {\n const selection = hot?.getSelected()?.[0];\n\n if (!selection) return;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0][2] == lastChange[0][3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n });\n });\n\n return (\n {\n lastChange = changes;\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n ref={hotRef}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/events-and-hooks/react/example2.tsx","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n let lastChange: string | any[] | null = null;\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.updateSettings({\n beforeKeyDown(e) {\n const selection = hot?.getSelected()?.[0];\n\n if (!selection) return;\n\n // Ignore header and corner selections (row or column index < 0)\n if (selection[0] < 0 || selection[1] < 0) return;\n\n console.log(selection);\n\n // BACKSPACE or DELETE\n if (e.keyCode === 8 || e.keyCode === 46) {\n // remove data at cell, shift the cells below it up\n const column = hot.getDataAtCol(selection[1]);\n const shiftedUp = column.slice(selection[0] + 1);\n shiftedUp.push(null);\n hot.populateFromArray(selection[0], selection[1], shiftedUp.map(value => [value]));\n e.preventDefault();\n lastChange = null;\n\n // block the default deletion behavior\n return false;\n }\n\n // ENTER\n if (e.keyCode === 13) {\n // if last change affected a single cell and did not change it's values\n if (lastChange && lastChange.length === 1 && lastChange[0][2] == lastChange[0][3]) {\n // insert an empty cell, shift the cells below it down\n const column = hot.getDataAtCol(selection[1]);\n const shiftedDown = ['', ...column.slice(selection[0])];\n hot.populateFromArray(selection[0], selection[1], shiftedDown.map(value => [value]));\n // add new cell\n hot.selectCell(selection[0], selection[1]);\n // select new cell\n lastChange = null;\n\n // block the default Enter behavior\n return false;\n }\n }\n\n lastChange = null;\n },\n });\n });\n\n return (\n {\n lastChange = changes;\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n ref={hotRef}\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/events-and-hooks/react/example2.tsx","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example3.tsx.json index 37f670b16..53a0670db 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Events and hooks · External control · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, ChangeEvent } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const [settings, setSettings] = useState(() => {\n const initialState = {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3', 'K3', 'L3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4', 'K4', 'L4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5', 'K5', 'L5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6', 'K6', 'L6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7', 'J7', 'K7', 'L7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8', 'K8', 'L8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9', 'J9', 'K9', 'L9'],\n ['A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10', 'I10', 'J10', 'K10', 'L11'],\n ['A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11', 'I11', 'J11', 'K11', 'L11'],\n ['A12', 'B12', 'C12', 'D12', 'E12', 'F12', 'G12', 'H12', 'I12', 'J12', 'K12', 'L12'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n };\n\n return initialState;\n });\n\n const handleChange = (setting: string, states: number[] | boolean[]) => (event: ChangeEvent) => {\n setSettings((prevState) => ({\n ...prevState,\n [setting]: states[(event.target as HTMLInputElement).checked ? 1 : 0],\n }));\n };\n\n return (\n
    \n
    \n
    \n \n
    \n\n \n
    \n\n \n
    \n\n \n
    \n
    \n
    \n\n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".example-3-max-width {\n max-width: 440px;\n}"},"docsPath":"guides/getting-started/events-and-hooks/react/example3.tsx","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Events and hooks · External control · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, ChangeEvent } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const [settings, setSettings] = useState(() => {\n const initialState = {\n data: [\n ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1'],\n ['A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2'],\n ['A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3', 'K3', 'L3'],\n ['A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4', 'I4', 'J4', 'K4', 'L4'],\n ['A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5', 'I5', 'J5', 'K5', 'L5'],\n ['A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6', 'I6', 'J6', 'K6', 'L6'],\n ['A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7', 'I7', 'J7', 'K7', 'L7'],\n ['A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8', 'I8', 'J8', 'K8', 'L8'],\n ['A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9', 'I9', 'J9', 'K9', 'L9'],\n ['A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10', 'I10', 'J10', 'K10', 'L11'],\n ['A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11', 'I11', 'J11', 'K11', 'L11'],\n ['A12', 'B12', 'C12', 'D12', 'E12', 'F12', 'G12', 'H12', 'I12', 'J12', 'K12', 'L12'],\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n height: 240,\n licenseKey: 'non-commercial-and-evaluation',\n };\n\n return initialState;\n });\n\n const handleChange = (setting: string, states: number[] | boolean[]) => (event: ChangeEvent) => {\n setSettings((prevState) => ({\n ...prevState,\n [setting]: states[(event.target as HTMLInputElement).checked ? 1 : 0],\n }));\n };\n\n return (\n
    \n
    \n
    \n \n
    \n\n \n
    \n\n \n
    \n\n \n
    \n
    \n
    \n\n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".example-3-max-width {\n max-width: 440px;\n}"},"docsPath":"guides/getting-started/events-and-hooks/react/example3.tsx","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example2.vue.json index 3c256f02c..21965e448 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/events-and-hooks/vue/example2.vue","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Events and hooks · The beforeKeyDown callback · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/events-and-hooks/vue/example2.vue","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example2","exampleTitle":"The beforeKeyDown callback","docPermalink":"/events-and-hooks","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example3.vue.json index a7e187325..d47817628 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__events-and-hooks__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Events and hooks · External control · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/events-and-hooks/vue/example3.vue","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Events and hooks · External control · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/events-and-hooks/vue/example3.vue","breadcrumb":["Getting Started","Events and hooks"],"guide":"guides/getting-started/events-and-hooks/events-and-hooks.md","guideTitle":"Events and hooks","exampleId":"example3","exampleTitle":"External control","docPermalink":"/events-and-hooks","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example.ts.json index bdf323ee9..482b8d20a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Grid size · Manual resizing · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-grid-size',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n {{ isContainerExpanded ? 'Collapse container' : 'Expand container' }}\n \n
    \n
    \n `,\n})\nexport class AppComponent {\n // generate an array of arrays with dummy data\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n isContainerExpanded = false;\n\n gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: 157,\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n btnClick(): void {\n this.isContainerExpanded = !this.isContainerExpanded;\n this.gridSettings = {\n ...this.gridSettings,\n height: this.isContainerExpanded ? 410 : 157,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/grid-size/angular/example.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Grid size · Manual resizing · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-grid-size',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n {{ isContainerExpanded ? 'Collapse container' : 'Expand container' }}\n \n
    \n
    \n `,\n})\nexport class AppComponent {\n // generate an array of arrays with dummy data\n readonly data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n isContainerExpanded = false;\n\n gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: 157,\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n btnClick(): void {\n this.isContainerExpanded = !this.isContainerExpanded;\n this.gridSettings = {\n ...this.gridSettings,\n height: this.isContainerExpanded ? 410 : 157,\n };\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/grid-size/angular/example.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example2.ts.json index 048dbdfa3..0a8ddcb78 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Grid size · Compare size units · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\n@Component({\n selector: 'example2-grid-size',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n \n
    \n

    {{ unitCaption }}

    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly unitKeys = Object.keys(UNIT_SIZES);\n unitCaption = UNIT_CAPTIONS['px'];\n\n readonly data = [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n };\n\n changeUnit(event: Event): void {\n const unit = UNIT_SIZES[(event.target as HTMLSelectElement).value];\n\n this.unitCaption = UNIT_CAPTIONS[(event.target as HTMLSelectElement).value];\n this.hotTable?.hotInstance?.updateSettings({ width: unit.width, height: unit.height });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#exampleParent2 > hot-table {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/angular/example2.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Grid size · Compare size units · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\n@Component({\n selector: 'example2-grid-size',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n \n
    \n

    {{ unitCaption }}

    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly unitKeys = Object.keys(UNIT_SIZES);\n unitCaption = UNIT_CAPTIONS['px'];\n\n readonly data = [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n };\n\n changeUnit(event: Event): void {\n const unit = UNIT_SIZES[(event.target as HTMLSelectElement).value];\n\n this.unitCaption = UNIT_CAPTIONS[(event.target as HTMLSelectElement).value];\n this.hotTable?.hotInstance?.updateSettings({ width: unit.width, height: unit.height });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#exampleParent2 > hot-table {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/angular/example2.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.js.json index 775838e03..bbb53ec75 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Grid size · Manual resizing · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst triggerBtn = document.querySelector('#triggerBtn');\nconst example = document.querySelector('#example');\nconst exampleParent = document.querySelector('#exampleParent');\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst hot = new Handsontable(example, {\n data,\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: '100%',\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ntriggerBtn.addEventListener('click', () => {\n if (triggerBtn.textContent === 'Collapse container') {\n exampleParent.style.height = ''; // reset to initial 150px;\n hot.refreshDimensions();\n triggerBtn.textContent = 'Expand container';\n } else {\n exampleParent.style.height = '410px';\n hot.refreshDimensions();\n triggerBtn.textContent = 'Collapse container';\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#example {\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example.js","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Grid size · Manual resizing · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst triggerBtn = document.querySelector('#triggerBtn');\nconst example = document.querySelector('#example');\nconst exampleParent = document.querySelector('#exampleParent');\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst hot = new Handsontable(example, {\n data,\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: '100%',\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ntriggerBtn.addEventListener('click', () => {\n if (triggerBtn.textContent === 'Collapse container') {\n exampleParent.style.height = ''; // reset to initial 150px;\n hot.refreshDimensions();\n triggerBtn.textContent = 'Expand container';\n } else {\n exampleParent.style.height = '410px';\n hot.refreshDimensions();\n triggerBtn.textContent = 'Collapse container';\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#example {\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example.js","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.ts.json index 778c66b7b..677bcc2cf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Grid size · Manual resizing · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst triggerBtn = document.querySelector('#triggerBtn')!;\nconst example = document.querySelector('#example')!;\nconst exampleParent = document.querySelector('#exampleParent') as HTMLElement;\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst hot = new Handsontable(example, {\n data,\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: '100%',\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ntriggerBtn.addEventListener('click', () => {\n if (triggerBtn.textContent === 'Collapse container') {\n exampleParent.style.height = ''; // reset to initial 150px;\n hot.refreshDimensions();\n triggerBtn.textContent = 'Expand container';\n } else {\n exampleParent.style.height = '410px';\n hot.refreshDimensions();\n triggerBtn.textContent = 'Collapse container';\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#example {\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Grid size · Manual resizing · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst triggerBtn = document.querySelector('#triggerBtn')!;\nconst example = document.querySelector('#example')!;\nconst exampleParent = document.querySelector('#exampleParent') as HTMLElement;\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst hot = new Handsontable(example, {\n data,\n rowHeaders: true,\n colHeaders: true,\n width: '100%',\n height: '100%',\n colWidths: 100,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\ntriggerBtn.addEventListener('click', () => {\n if (triggerBtn.textContent === 'Collapse container') {\n exampleParent.style.height = ''; // reset to initial 150px;\n hot.refreshDimensions();\n triggerBtn.textContent = 'Expand container';\n } else {\n exampleParent.style.height = '410px';\n hot.refreshDimensions();\n triggerBtn.textContent = 'Collapse container';\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#example {\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.js.json index eae19916f..59db5c64f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Grid size · Compare size units · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n

    \n
    \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst UNIT_SIZES = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\nconst UNIT_CAPTIONS = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\nconst container = document.querySelector('#example2');\nconst unitSelect = document.querySelector('#unitSelect');\nconst unitCaption = document.querySelector('#unitCaption');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n licenseKey: 'non-commercial-and-evaluation',\n});\nunitCaption.textContent = UNIT_CAPTIONS['px'];\nunitSelect.addEventListener('change', () => {\n const unit = UNIT_SIZES[unitSelect.value];\n hot.updateSettings({ width: unit.width, height: unit.height });\n unitCaption.textContent = UNIT_CAPTIONS[unitSelect.value];\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#example2 {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example2.js","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Grid size · Compare size units · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n

    \n
    \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst UNIT_SIZES = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\nconst UNIT_CAPTIONS = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\nconst container = document.querySelector('#example2');\nconst unitSelect = document.querySelector('#unitSelect');\nconst unitCaption = document.querySelector('#unitCaption');\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n licenseKey: 'non-commercial-and-evaluation',\n});\nunitCaption.textContent = UNIT_CAPTIONS['px'];\nunitSelect.addEventListener('change', () => {\n const unit = UNIT_SIZES[unitSelect.value];\n hot.updateSettings({ width: unit.width, height: unit.height });\n unitCaption.textContent = UNIT_CAPTIONS[unitSelect.value];\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#example2 {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example2.js","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.ts.json index 24dc333e9..e46043d89 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Grid size · Compare size units · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n

    \n
    \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\nconst container = document.querySelector('#example2')!;\nconst unitSelect = document.querySelector('#unitSelect')!;\nconst unitCaption = document.querySelector('#unitCaption')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nunitCaption.textContent = UNIT_CAPTIONS['px'];\n\nunitSelect.addEventListener('change', () => {\n const unit = UNIT_SIZES[unitSelect.value];\n\n hot.updateSettings({ width: unit.width, height: unit.height });\n unitCaption.textContent = UNIT_CAPTIONS[unitSelect.value];\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#example2 {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example2.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Grid size · Compare size units · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n

    \n
    \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\nconst container = document.querySelector('#example2')!;\nconst unitSelect = document.querySelector('#unitSelect')!;\nconst unitCaption = document.querySelector('#unitCaption')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n ],\n colHeaders: ['SKU', 'Product', 'Category', 'Supplier', 'Quantity'],\n rowHeaders: true,\n width: UNIT_SIZES['px'].width,\n height: UNIT_SIZES['px'].height,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nunitCaption.textContent = UNIT_CAPTIONS['px'];\n\nunitSelect.addEventListener('change', () => {\n const unit = UNIT_SIZES[unitSelect.value];\n\n hot.updateSettings({ width: unit.width, height: unit.height });\n unitCaption.textContent = UNIT_CAPTIONS[unitSelect.value];\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#example2 {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/javascript/example2.ts","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example.tsx.json index ad1f79c70..b93784be4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Grid size · Manual resizing · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n const [isContainerExpanded, setIsContainerExpanded] = useState(false);\n const hotRef = useRef(null);\n\n const triggerBtnClickCallback = () => {\n setIsContainerExpanded(!isContainerExpanded);\n };\n\n useEffect(() => {\n // simulate layout change outside of React lifecycle\n // @ts-ignore\n document.getElementById('exampleParent').style.height = isContainerExpanded ? '410px' : '157px';\n hotRef.current?.hotInstance?.refreshDimensions();\n });\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#exampleParent > div{\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/react/example.tsx","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Grid size · Manual resizing · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n const [isContainerExpanded, setIsContainerExpanded] = useState(false);\n const hotRef = useRef(null);\n\n const triggerBtnClickCallback = () => {\n setIsContainerExpanded(!isContainerExpanded);\n };\n\n useEffect(() => {\n // simulate layout change outside of React lifecycle\n // @ts-ignore\n document.getElementById('exampleParent').style.height = isContainerExpanded ? '410px' : '157px';\n hotRef.current?.hotInstance?.refreshDimensions();\n });\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n
    \n \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#exampleParent {\n height: 157px;\n}\n\n#exampleParent > div{\n height: 100%;\n}"},"docsPath":"guides/getting-started/grid-size/react/example.tsx","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example2.tsx.json index fcf4a58f8..869c20200 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Grid size · Compare size units · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n];\n\nconst ExampleComponent = () => {\n const [unit, setUnit] = useState('px');\n const { width, height } = UNIT_SIZES[unit];\n\n return (\n <>\n
    \n
    \n \n \n
    \n

    {UNIT_CAPTIONS[unit]}

    \n
    \n
    \n \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#exampleParent2 > div {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/react/example2.tsx","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Grid size · Compare size units · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst UNIT_SIZES: Record = {\n px: { width: '600px', height: '300px' },\n '%': { width: '75%', height: '75%' },\n em: { width: '37.5em', height: '18.75em' },\n rem: { width: '37.5rem', height: '18.75rem' },\n vh: { width: '50vh', height: '50vh' },\n vw: { width: '50vw', height: '50vw' },\n};\n\nconst UNIT_CAPTIONS: Record = {\n px: 'A fixed pixel size, independent of any parent element or font size.',\n '%': \"A percentage of the parent container's size (the dashed box).\",\n em: \"A multiple of this element's own font size.\",\n rem: \"A multiple of the document's root font size.\",\n vh: \"A percentage of the browser viewport's height.\",\n vw: \"A percentage of the browser viewport's width.\",\n};\n\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 'Electronics', 'Harbor Goods', 142],\n ['SKU-0093', 'Canvas Tote Bag', 'Apparel', 'Alpine Supply Co.', 67],\n ['SKU-2210', 'USB-C Hub', 'Electronics', 'Harbor Goods', 0],\n ['SKU-7734', 'Ceramic Mug Set', 'Home Goods', 'Nordic Traders', 58],\n ['SKU-1145', 'Wool Scarf', 'Apparel', 'Alpine Supply Co.', 213],\n ['SKU-3399', 'Bluetooth Speaker', 'Electronics', 'Harbor Goods', 84],\n ['SKU-5567', 'Cotton T-Shirt', 'Apparel', 'Alpine Supply Co.', 310],\n ['SKU-8842', 'Desk Lamp', 'Home Goods', 'Nordic Traders', 45],\n ['SKU-6621', 'Laptop Stand', 'Electronics', 'Harbor Goods', 29],\n ['SKU-4470', 'Throw Blanket', 'Home Goods', 'Nordic Traders', 76],\n ['SKU-9983', 'Leather Wallet', 'Apparel', 'Alpine Supply Co.', 132],\n ['SKU-2287', 'Wireless Charger', 'Electronics', 'Harbor Goods', 97],\n];\n\nconst ExampleComponent = () => {\n const [unit, setUnit] = useState('px');\n const { width, height } = UNIT_SIZES[unit];\n\n return (\n <>\n
    \n
    \n \n \n
    \n

    {UNIT_CAPTIONS[unit]}

    \n
    \n
    \n \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#exampleParent2 {\n width: 800px;\n max-width: 100%;\n height: 400px;\n box-sizing: border-box;\n border: 1px dashed var(--sl-color-gray-5, #d1d5db);\n}\n\n#exampleParent2 > div {\n height: 100%;\n}\n\n.unit-caption {\n margin-top: 8px;\n color: var(--sl-color-text, #485164);\n}"},"docsPath":"guides/getting-started/grid-size/react/example2.tsx","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example.vue.json index a2cdb2a46..2613cd97e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Grid size · Manual resizing · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/grid-size/vue/example.vue","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Grid size · Manual resizing · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/grid-size/vue/example.vue","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example","exampleTitle":"Manual resizing","docPermalink":"/grid-size","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example2.vue.json index e4a5b6337..ecc8f6339 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__grid-size__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Grid size · Compare size units · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/grid-size/vue/example2.vue","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Grid size · Compare size units · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/grid-size/vue/example2.vue","breadcrumb":["Getting Started","Grid size"],"guide":"guides/getting-started/grid-size/grid-size.md","guideTitle":"Grid size","exampleId":"example2","exampleTitle":"Compare size units","docPermalink":"/grid-size","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__angular__example1.ts.json index c5d8faf67..198bc1a58 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Installation · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-installation',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\nimport { registerLanguageDictionary, enUS } from \"handsontable/i18n\";\n\nregisterLanguageDictionary(enUS);\nregisterAllModules();\n\nconst globalHotConfig: HotGlobalConfig = {\n license: NON_COMMERCIAL_LICENSE,\n layoutDirection: \"ltr\",\n language: enUS.languageCode,\n};\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: globalHotConfig },\n ],\n};"},"docsPath":"guides/getting-started/installation/angular/example1.ts","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Installation · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example-installation',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\nimport { registerLanguageDictionary, enUS } from \"handsontable/i18n\";\n\nregisterLanguageDictionary(enUS);\nregisterAllModules();\n\nconst globalHotConfig: HotGlobalConfig = {\n license: NON_COMMERCIAL_LICENSE,\n layoutDirection: \"ltr\",\n language: enUS.languageCode,\n};\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n { provide: HOT_GLOBAL_CONFIG, useValue: globalHotConfig },\n ],\n};"},"docsPath":"guides/getting-started/installation/angular/example1.ts","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.js.json index d6e54581e..2803c232f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Installation · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation', // for non-commercial use only\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/installation/javascript/example1.js","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Installation · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation', // for non-commercial use only\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/installation/javascript/example1.js","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.ts.json index 6daec3690..ca935e468 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Installation · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst data: Handsontable.CellValue[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation', // for non-commercial use only\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/installation/javascript/example1.ts","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Installation · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nconst data: Handsontable.CellValue[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['SKU', 'Product', 'Supplier', 'Category', 'Warehouse'],\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation', // for non-commercial use only\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/installation/javascript/example1.ts","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__react__example1.tsx.json index fdf6bccc4..81895b41d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Installation · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable, HotTableProps } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/installation/react/example1.tsx","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Installation · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { FC } from 'react';\nimport { HotTable, HotTableProps } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent: FC = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/installation/react/example1.tsx","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__vue__example1.vue.json index eeaaeb091..839e98035 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__installation__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Installation · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/installation/vue/example1.vue","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Installation · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/installation/vue/example1.vue","breadcrumb":["Getting Started","Installation"],"guide":"guides/getting-started/installation/installation.md","guideTitle":"Installation","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/installation","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-methods__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-methods__react__example1.tsx.json index e18a1a3d3..59f1f7397 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-methods__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-methods__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Instance methods · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', '142'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', '0'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', '67'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', '215'],\n ];\n\n const hotTableComponentRef = useRef(null);\n\n const selectCell = () => {\n // The Handsontable instance is stored under the `hotInstance` property of the wrapper component.\n hotTableComponentRef.current?.hotInstance?.selectCell(1, 1);\n };\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-methods/react/example1.tsx","breadcrumb":["Getting Started","Instance methods"],"guide":"guides/getting-started/react-methods/react-methods.md","guideTitle":"Instance methods","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/instance-methods","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Instance methods · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const data: string[][] = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', '142'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', '0'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', '67'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', '215'],\n ];\n\n const hotTableComponentRef = useRef(null);\n\n const selectCell = () => {\n // The Handsontable instance is stored under the `hotInstance` property of the wrapper component.\n hotTableComponentRef.current?.hotInstance?.selectCell(1, 1);\n };\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-methods/react/example1.tsx","breadcrumb":["Getting Started","Instance methods"],"guide":"guides/getting-started/react-methods/react-methods.md","guideTitle":"Instance methods","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/instance-methods","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example1.tsx.json index b3b429c99..ea195fb72 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Integration with Redux · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"redux\": \"5.0.1\",\n \"react-redux\": \"9.3.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, MouseEvent, JSXElementConstructor, Key, ReactElement, ReactNode, ReactPortal } from 'react';\nimport { createStore } from 'redux';\nimport { Provider, useSelector, useDispatch } from 'react-redux';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponentContent = () => {\n const hotSettings = useSelector((state: RootState) => state);\n const dispatch = useDispatch();\n const hotTableComponentRef = useRef(null);\n\n const hotData = hotSettings.data;\n const isHotData = Array.isArray(hotData);\n\n const onBeforeHotChange = (changes: (Handsontable.CellChange | null)[]) => {\n dispatch({\n type: 'updateData',\n dataChanges: changes,\n });\n\n return false;\n };\n\n const toggleReadOnly = (event: MouseEvent) => {\n dispatch({\n type: 'updateReadOnly',\n readOnly: (event.target as HTMLInputElement).checked,\n });\n };\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n
    \n

    Redux store dump

    \n
    \n          {isHotData && (\n            
    \n data:\n
    \n \n {hotData.map((row, i) => (\n \n {row.map(\n (\n cell:\n | string\n | number\n | boolean\n | ReactElement>\n | Iterable\n | ReactPortal\n | null\n | undefined,\n i: Key | null | undefined\n ) => (\n \n )\n )}\n \n ))}\n \n
    {cell}
    \n \n )}\n\n \n \n {Object.entries(hotSettings).map(\n ([name, value]) =>\n name !== 'data' && (\n \n \n \n \n )\n )}\n \n
    \n {name}:\n {value.toString()}
    \n \n \n \n );\n};\n\nconst initialReduxStoreState = {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale'],\n ],\n colHeaders: true,\n rowHeaders: true,\n readOnly: false,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst updatesReducer = (\n state = initialReduxStoreState,\n action: { type: any; dataChanges: [any, any, any, any][]; readOnly: any }\n) => {\n switch (action.type) {\n case 'updateData': {\n let hasChanged = false;\n const newData = state.data.map((row) => [...row]);\n\n action.dataChanges.forEach(([row, column, oldValue, newValue]) => {\n if (newData[row][column] !== newValue) {\n newData[row][column] = newValue;\n hasChanged = true;\n }\n });\n\n // Return the previous state when no value actually changed. Plugins write to the grid on\n // their own (`mergeCells` clears the cells that a merge area covers), and handing back a new\n // state object every time would re-render the component and resend the settings in a loop.\n return hasChanged ? { ...state, data: newData } : state;\n }\n\n case 'updateReadOnly':\n return {\n ...state,\n readOnly: action.readOnly,\n };\n\n default:\n return state;\n }\n};\n\nexport type RootState = ReturnType;\n\nconst reduxStore = createStore(updatesReducer);\n\nconst ExampleComponent = () => (\n \n \n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-redux/react/example1.tsx","breadcrumb":["Getting Started","Integration with Redux"],"guide":"guides/getting-started/react-redux/react-redux.md","guideTitle":"Integration with Redux","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/redux","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Integration with Redux · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"redux\": \"5.0.1\",\n \"react-redux\": \"9.3.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, MouseEvent, JSXElementConstructor, Key, ReactElement, ReactNode, ReactPortal } from 'react';\nimport { createStore } from 'redux';\nimport { Provider, useSelector, useDispatch } from 'react-redux';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponentContent = () => {\n const hotSettings = useSelector((state: RootState) => state);\n const dispatch = useDispatch();\n const hotTableComponentRef = useRef(null);\n\n const hotData = hotSettings.data;\n const isHotData = Array.isArray(hotData);\n\n const onBeforeHotChange = (changes: (Handsontable.CellChange | null)[]) => {\n dispatch({\n type: 'updateData',\n dataChanges: changes,\n });\n\n return false;\n };\n\n const toggleReadOnly = (event: MouseEvent) => {\n dispatch({\n type: 'updateReadOnly',\n readOnly: (event.target as HTMLInputElement).checked,\n });\n };\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n
    \n

    Redux store dump

    \n
    \n          {isHotData && (\n            
    \n data:\n \n \n {hotData.map((row, i) => (\n \n {row.map(\n (\n cell:\n | string\n | number\n | boolean\n | ReactElement>\n | Iterable\n | ReactPortal\n | null\n | undefined,\n i: Key | null | undefined\n ) => (\n \n )\n )}\n \n ))}\n \n
    {cell}
    \n
    \n )}\n\n \n \n {Object.entries(hotSettings).map(\n ([name, value]) =>\n name !== 'data' && (\n \n \n \n \n )\n )}\n \n
    \n {name}:\n {value.toString()}
    \n
    \n
    \n
    \n );\n};\n\nconst initialReduxStoreState = {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale'],\n ],\n colHeaders: true,\n rowHeaders: true,\n readOnly: false,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n};\n\nconst updatesReducer = (\n state = initialReduxStoreState,\n action: { type: any; dataChanges: [any, any, any, any][]; readOnly: any }\n) => {\n switch (action.type) {\n case 'updateData': {\n let hasChanged = false;\n const newData = state.data.map((row) => [...row]);\n\n action.dataChanges.forEach(([row, column, oldValue, newValue]) => {\n if (newData[row][column] !== newValue) {\n newData[row][column] = newValue;\n hasChanged = true;\n }\n });\n\n // Return the previous state when no value actually changed. Plugins write to the grid on\n // their own (`mergeCells` clears the cells that a merge area covers), and handing back a new\n // state object every time would re-render the component and resend the settings in a loop.\n return hasChanged ? { ...state, data: newData } : state;\n }\n\n case 'updateReadOnly':\n return {\n ...state,\n readOnly: action.readOnly,\n };\n\n default:\n return state;\n }\n};\n\nexport type RootState = ReturnType;\n\nconst reduxStore = createStore(updatesReducer);\n\nconst ExampleComponent = () => (\n \n \n \n);\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-redux/react/example1.tsx","breadcrumb":["Getting Started","Integration with Redux"],"guide":"guides/getting-started/react-redux/react-redux.md","guideTitle":"Integration with Redux","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/redux","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example6.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example6.tsx.json index ead4795b4..59287d5c0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example6.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__react-redux__react__example6.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Integration with Redux · Advanced example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"react-colorful\": \"5.8.1\",\n \"react-redux\": \"9.3.1\",\n \"redux\": \"5.0.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, MouseEvent, KeyboardEvent, useRef, useState } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HexColorPicker } from 'react-colorful';\nimport { Provider, connect, useDispatch } from 'react-redux';\nimport { createStore, combineReducers } from 'redux';\nimport { HotTable, HotColumn, useHotEditor } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface StarRatingProps {\n name: string;\n value?: number;\n starCount?: number;\n starColor?: string;\n emptyStarColor?: string;\n}\n\nfunction StarRating({ name, value = 0, starCount = 5, starColor = '#ffb400', emptyStarColor = '#d3d3d3' }: StarRatingProps) {\n return (\n
    \n {Array.from({ length: starCount }, (_, i) => (\n \n ★\n \n ))}\n
    \n );\n}\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\nconst UnconnectedColorPickerEditor = () => {\n const dispatch = useDispatch();\n const editorRef = useRef(null);\n const [pickedColor, setPickedColor] = useState('');\n\n const { value, setValue, isOpen, finishEditing, col, row } = useHotEditor({\n onOpen: () => {\n if (editorRef.current) editorRef.current.style.display = 'block';\n (document.querySelector('.react-colorful__interactive') as HTMLDivElement)?.focus();\n },\n onClose: () => {\n if (editorRef.current) editorRef.current.style.display = 'none';\n\n setPickedColor('');\n },\n onPrepare: (_row, _column, _prop, TD, _originalValue, _cellProperties) => {\n const tdPosition = TD.getBoundingClientRect();\n\n if (!editorRef.current) return;\n\n editorRef.current.style.left = `${tdPosition.left + window.pageXOffset}px`;\n editorRef.current.style.top = `${tdPosition.top + window.pageYOffset}px`;\n },\n onFocus: () => {},\n });\n\n const onPickedColor = (color: string) => {\n setValue(color);\n };\n\n const applyColor = () => {\n if (col === 1) {\n dispatch({\n type: 'updateActiveStarColor',\n row,\n hexColor: value,\n });\n } else if (col === 2) {\n dispatch({\n type: 'updateInactiveStarColor',\n row,\n hexColor: value,\n });\n }\n\n finishEditing();\n };\n\n const stopMousedownPropagation = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const stopKeyboardPropagation = (e: KeyboardEvent) => {\n e.stopPropagation();\n\n if (e.key === 'Escape') {\n applyColor();\n }\n };\n\n return (\n \n \n \n \n );\n};\n\nconst ColorPickerEditor = connect(function (state: RootState) {\n return {\n activeColors: state.appReducer.activeColors,\n inactiveColors: state.appReducer.inactiveColors,\n };\n})(UnconnectedColorPickerEditor);\n\nconst ColorPickerRenderer = ({ value }: RendererProps) => {\n return (\n <>\n \n
    {value}
    \n \n );\n};\n\n// a Redux component\nconst initialReduxStoreState: {\n activeColors?: string[];\n inactiveColors?: string[];\n} = {\n activeColors: [],\n inactiveColors: [],\n};\n\nconst appReducer = (\n state = initialReduxStoreState,\n action: { type?: any; row?: any; hexColor?: any; hotData?: any }\n) => {\n switch (action.type) {\n case 'initRatingColors': {\n const { hotData } = action;\n\n const activeColors = hotData.map((data: string[]) => data[1]);\n const inactiveColors = hotData.map((data: string[]) => data[2]);\n\n return {\n ...state,\n activeColors,\n inactiveColors,\n };\n }\n\n case 'updateActiveStarColor': {\n const rowIndex = action.row;\n const newColor = action.hexColor;\n\n const activeColorArray = state.activeColors ? [...state.activeColors] : [];\n\n activeColorArray[rowIndex] = newColor;\n\n return {\n ...state,\n activeColors: activeColorArray,\n };\n }\n\n case 'updateInactiveStarColor': {\n const rowIndex = action.row;\n const newColor = action.hexColor;\n\n const inactiveColorArray = state.inactiveColors ? [...state.inactiveColors] : [];\n\n inactiveColorArray[rowIndex] = newColor;\n\n return {\n ...state,\n inactiveColors: inactiveColorArray,\n };\n }\n\n default:\n return state;\n }\n};\n\nconst actionReducers = combineReducers({ appReducer });\nconst reduxStore = createStore(actionReducers);\n\ntype RootState = ReturnType;\n\n// a custom renderer component\nconst UnconnectedStarRatingRenderer = ({\n row,\n col,\n value,\n activeColors,\n inactiveColors,\n}: {\n row?: number;\n col?: number;\n value?: number;\n activeColors?: string;\n inactiveColors?: string;\n}) => {\n return (\n \n );\n};\n\nconst StarRatingRenderer = connect((state: RootState) => ({\n activeColors: state.appReducer.activeColors,\n inactiveColors: state.appReducer.inactiveColors,\n}))(UnconnectedStarRatingRenderer);\n\nconst data = [\n [1, '#ff6900', '#fcb900'],\n [2, '#fcb900', '#7bdcb5'],\n [3, '#7bdcb5', '#8ed1fc'],\n [4, '#00d084', '#0693e3'],\n [5, '#eb144c', '#abb8c3'],\n];\n\nconst ExampleComponent = () => {\n useEffect(() => {\n reduxStore.dispatch({\n type: 'initRatingColors',\n hotData: data,\n });\n }, []);\n\n return (\n \n \n \n \n \n
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-redux/react/example6.tsx","breadcrumb":["Getting Started","Integration with Redux"],"guide":"guides/getting-started/react-redux/react-redux.md","guideTitle":"Integration with Redux","exampleId":"example6","exampleTitle":"Advanced example","docPermalink":"/redux","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Integration with Redux · Advanced example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"react-colorful\": \"5.8.1\",\n \"react-redux\": \"9.3.1\",\n \"redux\": \"5.0.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example6\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, MouseEvent, KeyboardEvent, useRef, useState } from 'react';\nimport Handsontable from 'handsontable/base';\nimport { HexColorPicker } from 'react-colorful';\nimport { Provider, connect, useDispatch } from 'react-redux';\nimport { createStore, combineReducers } from 'redux';\nimport { HotTable, HotColumn, useHotEditor } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\ninterface StarRatingProps {\n name: string;\n value?: number;\n starCount?: number;\n starColor?: string;\n emptyStarColor?: string;\n}\n\nfunction StarRating({ name, value = 0, starCount = 5, starColor = '#ffb400', emptyStarColor = '#d3d3d3' }: StarRatingProps) {\n return (\n
    \n {Array.from({ length: starCount }, (_, i) => (\n \n ★\n \n ))}\n
    \n );\n}\n\ntype RendererProps = {\n TD?: HTMLTableCellElement;\n value?: string | number;\n row?: number;\n col?: number;\n cellProperties?: Handsontable.CellProperties;\n};\n\nconst UnconnectedColorPickerEditor = () => {\n const dispatch = useDispatch();\n const editorRef = useRef(null);\n const [pickedColor, setPickedColor] = useState('');\n\n const { value, setValue, isOpen, finishEditing, col, row } = useHotEditor({\n onOpen: () => {\n if (editorRef.current) editorRef.current.style.display = 'block';\n (document.querySelector('.react-colorful__interactive') as HTMLDivElement)?.focus();\n },\n onClose: () => {\n if (editorRef.current) editorRef.current.style.display = 'none';\n\n setPickedColor('');\n },\n onPrepare: (_row, _column, _prop, TD, _originalValue, _cellProperties) => {\n const tdPosition = TD.getBoundingClientRect();\n\n if (!editorRef.current) return;\n\n editorRef.current.style.left = `${tdPosition.left + window.pageXOffset}px`;\n editorRef.current.style.top = `${tdPosition.top + window.pageYOffset}px`;\n },\n onFocus: () => {},\n });\n\n const onPickedColor = (color: string) => {\n setValue(color);\n };\n\n const applyColor = () => {\n if (col === 1) {\n dispatch({\n type: 'updateActiveStarColor',\n row,\n hexColor: value,\n });\n } else if (col === 2) {\n dispatch({\n type: 'updateInactiveStarColor',\n row,\n hexColor: value,\n });\n }\n\n finishEditing();\n };\n\n const stopMousedownPropagation = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const stopKeyboardPropagation = (e: KeyboardEvent) => {\n e.stopPropagation();\n\n if (e.key === 'Escape') {\n applyColor();\n }\n };\n\n return (\n \n \n \n \n );\n};\n\nconst ColorPickerEditor = connect(function (state: RootState) {\n return {\n activeColors: state.appReducer.activeColors,\n inactiveColors: state.appReducer.inactiveColors,\n };\n})(UnconnectedColorPickerEditor);\n\nconst ColorPickerRenderer = ({ value }: RendererProps) => {\n return (\n <>\n \n
    {value}
    \n \n );\n};\n\n// a Redux component\nconst initialReduxStoreState: {\n activeColors?: string[];\n inactiveColors?: string[];\n} = {\n activeColors: [],\n inactiveColors: [],\n};\n\nconst appReducer = (\n state = initialReduxStoreState,\n action: { type?: any; row?: any; hexColor?: any; hotData?: any }\n) => {\n switch (action.type) {\n case 'initRatingColors': {\n const { hotData } = action;\n\n const activeColors = hotData.map((data: string[]) => data[1]);\n const inactiveColors = hotData.map((data: string[]) => data[2]);\n\n return {\n ...state,\n activeColors,\n inactiveColors,\n };\n }\n\n case 'updateActiveStarColor': {\n const rowIndex = action.row;\n const newColor = action.hexColor;\n\n const activeColorArray = state.activeColors ? [...state.activeColors] : [];\n\n activeColorArray[rowIndex] = newColor;\n\n return {\n ...state,\n activeColors: activeColorArray,\n };\n }\n\n case 'updateInactiveStarColor': {\n const rowIndex = action.row;\n const newColor = action.hexColor;\n\n const inactiveColorArray = state.inactiveColors ? [...state.inactiveColors] : [];\n\n inactiveColorArray[rowIndex] = newColor;\n\n return {\n ...state,\n inactiveColors: inactiveColorArray,\n };\n }\n\n default:\n return state;\n }\n};\n\nconst actionReducers = combineReducers({ appReducer });\nconst reduxStore = createStore(actionReducers);\n\ntype RootState = ReturnType;\n\n// a custom renderer component\nconst UnconnectedStarRatingRenderer = ({\n row,\n col,\n value,\n activeColors,\n inactiveColors,\n}: {\n row?: number;\n col?: number;\n value?: number;\n activeColors?: string;\n inactiveColors?: string;\n}) => {\n return (\n \n );\n};\n\nconst StarRatingRenderer = connect((state: RootState) => ({\n activeColors: state.appReducer.activeColors,\n inactiveColors: state.appReducer.inactiveColors,\n}))(UnconnectedStarRatingRenderer);\n\nconst data = [\n [1, '#ff6900', '#fcb900'],\n [2, '#fcb900', '#7bdcb5'],\n [3, '#7bdcb5', '#8ed1fc'],\n [4, '#00d084', '#0693e3'],\n [5, '#eb144c', '#abb8c3'],\n];\n\nconst ExampleComponent = () => {\n useEffect(() => {\n reduxStore.dispatch({\n type: 'initRatingColors',\n hotData: data,\n });\n }, []);\n\n return (\n \n \n \n \n \n
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/react-redux/react/example6.tsx","breadcrumb":["Getting Started","Integration with Redux"],"guide":"guides/getting-started/react-redux/react-redux.md","guideTitle":"Integration with Redux","exampleId":"example6","exampleTitle":"Advanced example","docPermalink":"/redux","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__angular__example1.ts.json index af481638f..84be661cc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Saving data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
    \n \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, ViewEncapsulation, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example1-saving-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n Load data\n \n \n Save data\n \n \n
    \n {{ output }} \n
    \n
    \n \n
    `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n isAutoSave = false;\n output: string = 'Click \"Load\" to load data from server';\n\n readonly gridSettings: GridSettings = {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n\n afterChange: (\n change: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ) => {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!this.isAutoSave) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n this.output = `Autosaved (${change?.length} cell${\n (change?.length || 0) > 1 ? 's' : ''\n })`;\n this.cdr.markForCheck();\n console.log('The POST request is only used here for the demo purposes');\n });\n }\n };\n\n autosaveClickCallback(event: MouseEvent): void {\n const target = event.target as HTMLInputElement;\n\n this.isAutoSave = target.checked;\n\n if (target.checked) {\n this.output = 'Changes will be autosaved';\n } else {\n this.output = 'Changes will not be autosaved';\n }\n }\n\n loadClickCallback(event: MouseEvent): void {\n const hot = this.hotTable?.hotInstance;\n\n fetch('/docs/scripts/json/load.json').then(\n (response) => {\n response.json().then((data) => {\n hot?.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n this.output = 'Data loaded';\n this.cdr.markForCheck();\n });\n }\n );\n }\n\n saveClickCallback(event: MouseEvent): void {\n const hot = this.hotTable?.hotInstance;\n\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot?.getData() }),\n }).then(() => {\n this.output = 'Data saved';\n this.cdr.markForCheck();\n console.log('The POST request is only used here for the demo purposes');\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/saving-data/angular/example1.ts","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Saving data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
    \n \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, ViewEncapsulation, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example1-saving-data',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n Load data\n \n \n Save data\n \n \n
    \n {{ output }} \n
    \n
    \n \n
    `,\n encapsulation: ViewEncapsulation.None\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n isAutoSave = false;\n output: string = 'Click \"Load\" to load data from server';\n\n readonly gridSettings: GridSettings = {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n\n afterChange: (\n change: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ) => {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!this.isAutoSave) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n this.output = `Autosaved (${change?.length} cell${\n (change?.length || 0) > 1 ? 's' : ''\n })`;\n this.cdr.markForCheck();\n console.log('The POST request is only used here for the demo purposes');\n });\n }\n };\n\n autosaveClickCallback(event: MouseEvent): void {\n const target = event.target as HTMLInputElement;\n\n this.isAutoSave = target.checked;\n\n if (target.checked) {\n this.output = 'Changes will be autosaved';\n } else {\n this.output = 'Changes will not be autosaved';\n }\n }\n\n loadClickCallback(event: MouseEvent): void {\n const hot = this.hotTable?.hotInstance;\n\n fetch('/docs/scripts/json/load.json').then(\n (response) => {\n response.json().then((data) => {\n hot?.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n this.output = 'Data loaded';\n this.cdr.markForCheck();\n });\n }\n );\n }\n\n saveClickCallback(event: MouseEvent): void {\n const hot = this.hotTable?.hotInstance;\n\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot?.getData() }),\n }).then(() => {\n this.output = 'Data saved';\n this.cdr.markForCheck();\n console.log('The POST request is only used here for the demo purposes');\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/saving-data/angular/example1.ts","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.js.json index 5c01af472..1d2b52cd8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Saving data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n \n
    \n \n Click \"Load\" to load data from server\n
    \n \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst exampleConsole = document.querySelector('#output');\nconst autosave = document.querySelector('#autosave');\nconst load = document.querySelector('#load');\nconst save = document.querySelector('#save');\nconst hot = new Handsontable(container, {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(change, source) {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!change) {\n return;\n }\n\n if (!autosave.checked) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n exampleConsole.innerText = `Autosaved (${change.length} cell${change.length > 1 ? 's' : ''})`;\n console.log('The POST request is only used here for the demo purposes');\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\nload.addEventListener('click', () => {\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n exampleConsole.innerText = 'Data loaded';\n });\n });\n});\nsave.addEventListener('click', () => {\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot.getData() }),\n }).then(() => {\n exampleConsole.innerText = 'Data saved';\n console.log('The POST request is only used here for the demo purposes');\n });\n});\nautosave.addEventListener('click', () => {\n if (autosave.checked) {\n exampleConsole.innerText = 'Changes will be autosaved';\n } else {\n exampleConsole.innerText = 'Changes will not be autosaved';\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/javascript/example1.js","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Saving data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n \n
    \n \n Click \"Load\" to load data from server\n
    \n \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst exampleConsole = document.querySelector('#output');\nconst autosave = document.querySelector('#autosave');\nconst load = document.querySelector('#load');\nconst save = document.querySelector('#save');\nconst hot = new Handsontable(container, {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(change, source) {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!change) {\n return;\n }\n\n if (!autosave.checked) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n exampleConsole.innerText = `Autosaved (${change.length} cell${change.length > 1 ? 's' : ''})`;\n console.log('The POST request is only used here for the demo purposes');\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\nload.addEventListener('click', () => {\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n exampleConsole.innerText = 'Data loaded';\n });\n });\n});\nsave.addEventListener('click', () => {\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot.getData() }),\n }).then(() => {\n exampleConsole.innerText = 'Data saved';\n console.log('The POST request is only used here for the demo purposes');\n });\n});\nautosave.addEventListener('click', () => {\n if (autosave.checked) {\n exampleConsole.innerText = 'Changes will be autosaved';\n } else {\n exampleConsole.innerText = 'Changes will not be autosaved';\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/javascript/example1.js","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.ts.json index 46156652c..3da72456b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Saving data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n \n
    \n \n Click \"Load\" to load data from server\n
    \n \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst exampleConsole = document.querySelector('#output')!;\nconst autosave = document.querySelector('#autosave')!;\nconst load = document.querySelector('#load')!;\nconst save = document.querySelector('#save')!;\n\nconst hot = new Handsontable(container, {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(change: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!change) {\n return;\n }\n\n if (!autosave.checked) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n exampleConsole.innerText = `Autosaved (${change.length} cell${change.length > 1 ? 's' : ''})`;\n console.log('The POST request is only used here for the demo purposes');\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\nload.addEventListener('click', () => {\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n exampleConsole.innerText = 'Data loaded';\n });\n });\n});\n\nsave.addEventListener('click', () => {\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot.getData() }),\n }).then(() => {\n exampleConsole.innerText = 'Data saved';\n console.log('The POST request is only used here for the demo purposes');\n });\n});\n\nautosave.addEventListener('click', () => {\n if (autosave.checked) {\n exampleConsole.innerText = 'Changes will be autosaved';\n } else {\n exampleConsole.innerText = 'Changes will not be autosaved';\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/javascript/example1.ts","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Saving data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n \n
    \n \n Click \"Load\" to load data from server\n
    \n \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst exampleConsole = document.querySelector('#output')!;\nconst autosave = document.querySelector('#autosave')!;\nconst load = document.querySelector('#load')!;\nconst save = document.querySelector('#save')!;\n\nconst hot = new Handsontable(container, {\n startRows: 8,\n startCols: 6,\n rowHeaders: true,\n colHeaders: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(change: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source === 'loadData') {\n return; // don't save this change\n }\n\n if (!change) {\n return;\n }\n\n if (!autosave.checked) {\n return;\n }\n\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: change }),\n }).then(() => {\n exampleConsole.innerText = `Autosaved (${change.length} cell${change.length > 1 ? 's' : ''})`;\n console.log('The POST request is only used here for the demo purposes');\n });\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});\n\nload.addEventListener('click', () => {\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n exampleConsole.innerText = 'Data loaded';\n });\n });\n});\n\nsave.addEventListener('click', () => {\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot.getData() }),\n }).then(() => {\n exampleConsole.innerText = 'Data saved';\n console.log('The POST request is only used here for the demo purposes');\n });\n});\n\nautosave.addEventListener('click', () => {\n if (autosave.checked) {\n exampleConsole.innerText = 'Changes will be autosaved';\n } else {\n exampleConsole.innerText = 'Changes will not be autosaved';\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/javascript/example1.ts","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__react__example1.tsx.json index 942ee17e4..a46c105ec 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Saving data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useRef, MouseEvent } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent: React.FC = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('Click \"Load\" to load data from server');\n\n const [isAutosave, setIsAutosave] = useState(false);\n\n const autosaveClickCallback = (event: MouseEvent) => {\n const target = event.target as HTMLInputElement;\n\n setIsAutosave(target.checked);\n\n if (target.checked) {\n setOutput('Changes will be autosaved');\n } else {\n setOutput('Changes will not be autosaved');\n }\n };\n\n const loadClickCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot?.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n setOutput('Data loaded');\n });\n });\n };\n\n const saveClickCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot?.getData() }),\n }).then(() => {\n setOutput('Data saved');\n console.log('The POST request is only used here for the demo purposes');\n });\n };\n\n return (\n <>\n
    \n
    \n \n \n \n
    \n \n {output}\n \n
    \n {\n setOutput(`Autosaved (${change?.length} cell${(change?.length || 0) > 1 ? 's' : ''})`);\n console.log('The POST request is only used here for the demo purposes');\n });\n }}\n />\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/react/example1.tsx","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Saving data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useRef, MouseEvent } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent: React.FC = () => {\n const hotRef = useRef(null);\n const [output, setOutput] = useState('Click \"Load\" to load data from server');\n\n const [isAutosave, setIsAutosave] = useState(false);\n\n const autosaveClickCallback = (event: MouseEvent) => {\n const target = event.target as HTMLInputElement;\n\n setIsAutosave(target.checked);\n\n if (target.checked) {\n setOutput('Changes will be autosaved');\n } else {\n setOutput('Changes will not be autosaved');\n }\n };\n\n const loadClickCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n fetch('/docs/scripts/json/load.json').then((response) => {\n response.json().then((data) => {\n hot?.loadData(data.data);\n // or, use `updateData()` to replace `data` without resetting states\n setOutput('Data loaded');\n });\n });\n };\n\n const saveClickCallback = (event: MouseEvent) => {\n const hot = hotRef.current?.hotInstance;\n\n // save all cell's data\n fetch('/docs/scripts/json/save.json', {\n method: 'POST',\n mode: 'no-cors',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ data: hot?.getData() }),\n }).then(() => {\n setOutput('Data saved');\n console.log('The POST request is only used here for the demo purposes');\n });\n };\n\n return (\n <>\n
    \n
    \n \n \n \n
    \n \n {output}\n \n
    \n {\n setOutput(`Autosaved (${change?.length} cell${(change?.length || 0) > 1 ? 's' : ''})`);\n console.log('The POST request is only used here for the demo purposes');\n });\n }}\n />\n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/saving-data/react/example1.tsx","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__vue__example1.vue.json index ec73541b0..a55724645 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__saving-data__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Saving data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/saving-data/vue/example1.vue","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Saving data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/saving-data/vue/example1.vue","breadcrumb":["Getting Started","Saving data"],"guide":"guides/getting-started/saving-data/saving-data.md","guideTitle":"Saving data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/saving-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__angular__example1.ts.json index 8e5b2a844..d99b5bec8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Server-side row selection · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\n@Component({\n selector: 'app-example1',\n template: `\n \n {{ output }}\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n output = '0 selected';\n\n readonly hotSettings: GridSettings = {\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData: unknown) => (rowData as Order).status !== 'Cancelled',\n },\n afterRowSelectionChange: () => {\n const rowSelection = this.hotTable.hotInstance!.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n this.output = `${rowSelection.getSelectedCount()} selected: ${JSON.stringify(rowSelection.getServerSelection())}`;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/server-side-data-row-selection/angular/example1.ts","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Server-side row selection · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\n@Component({\n selector: 'app-example1',\n template: `\n \n {{ output }}\n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false })\n readonly hotTable!: HotTableComponent;\n\n output = '0 selected';\n\n readonly hotSettings: GridSettings = {\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData: unknown) => (rowData as Order).status !== 'Cancelled',\n },\n afterRowSelectionChange: () => {\n const rowSelection = this.hotTable.hotInstance!.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n this.output = `${rowSelection.getSelectedCount()} selected: ${JSON.stringify(rowSelection.getServerSelection())}`;\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/server-side-data-row-selection/angular/example1.ts","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.js.json index d9c7954cb..bccfe9dae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Server-side row selection · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n 0 selected\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\nconst container = document.querySelector('#example1');\nconst output = document.querySelector('#example1-output');\n\nconst hot = new Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData) => rowData.status !== 'Cancelled',\n },\n afterRowSelectionChange() {\n const rowSelection = hot.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n output.innerText = `${rowSelection.getSelectedCount()} selected: ` +\n JSON.stringify(rowSelection.getServerSelection());\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/server-side-data-row-selection/javascript/example1.js","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Server-side row selection · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n 0 selected\n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\nconst container = document.querySelector('#example1');\nconst output = document.querySelector('#example1-output');\n\nconst hot = new Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData) => rowData.status !== 'Cancelled',\n },\n afterRowSelectionChange() {\n const rowSelection = hot.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n output.innerText = `${rowSelection.getSelectedCount()} selected: ` +\n JSON.stringify(rowSelection.getServerSelection());\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/server-side-data-row-selection/javascript/example1.js","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.ts.json index c4fc5c4d5..e775234b0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Server-side row selection · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n 0 selected\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\nconst container = document.querySelector('#example1')!;\nconst output = document.querySelector('#example1-output')!;\n\nconst hot = new Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData) => (rowData as Order).status !== 'Cancelled',\n },\n afterRowSelectionChange() {\n const rowSelection = hot.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n output.innerText = `${rowSelection.getSelectedCount()} selected: ` +\n JSON.stringify(rowSelection.getServerSelection());\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/server-side-data-row-selection/javascript/example1.ts","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Server-side row selection · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n 0 selected\n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\nconst container = document.querySelector('#example1')!;\nconst output = document.querySelector('#example1-output')!;\n\nconst hot = new Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n dataProvider: {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n },\n columns: [\n { data: 'id', title: 'Order', readOnly: true },\n { data: 'customer', title: 'Customer' },\n { data: 'status', title: 'Status' },\n { data: 'total', title: 'Total', type: 'numeric' },\n ],\n colHeaders: true,\n rowHeaders: true,\n // reach the header checkboxes with the arrow keys, toggle them with Space\n navigableHeaders: true,\n pagination: { pageSize: 10 },\n height: 'auto',\n // enable the `RowSelection` plugin\n rowSelection: {\n // cancelled orders can't be selected\n isRowSelectable: (rowData) => (rowData as Order).status !== 'Cancelled',\n },\n afterRowSelectionChange() {\n const rowSelection = hot.getPlugin('rowSelection');\n\n // send this object to your server, which applies it to the rows it did not send\n output.innerText = `${rowSelection.getSelectedCount()} selected: ` +\n JSON.stringify(rowSelection.getServerSelection());\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/server-side-data-row-selection/javascript/example1.ts","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__react__example1.tsx.json index e77b2597f..4d91a25f8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Server-side row selection · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\n// register Handsontable's modules\nregisterAllModules();\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\n// The React wrapper calls `updateSettings` after every HotTable render. With\n// `dataProvider`, each call refetches the current page. Keep this object\n// stable, and write the selection status through a DOM ref so a checkbox\n// click does not re-render HotTable.\nconst dataProvider = {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const outputRef = useRef(null);\n\n return (\n <>\n (rowData as Order).status !== 'Cancelled',\n }}\n afterRowSelectionChange={() => {\n const rowSelection = hotRef.current?.hotInstance?.getPlugin('rowSelection');\n\n if (rowSelection && outputRef.current) {\n // send this object to your server, which applies it to the rows it did not send\n outputRef.current.textContent = `${rowSelection.getSelectedCount()} selected: ${JSON.stringify(rowSelection.getServerSelection())}`;\n }\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n />\n 0 selected\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/server-side-data-row-selection/react/example1.tsx","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Server-side row selection · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\n// register Handsontable's modules\nregisterAllModules();\n\ntype Order = { id: number; customer: string; status: string; total: number };\n\nconst STATUSES = ['Pending', 'Paid', 'Shipped', 'Cancelled'];\nconst CUSTOMERS = ['Harbor Goods', 'Alpine Supply Co.', 'Cascade Distributors', 'Summit Trading', 'Nordic Traders'];\n\n// An in-memory \"server\" with 40 orders. Replace it with requests to your API.\nconst serverOrders: Order[] = Array.from({ length: 40 }, (_, index) => ({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n status: STATUSES[index % STATUSES.length],\n total: 25 + ((index * 37) % 400),\n}));\n\nconst fetchOrders = async({ page, pageSize }: DataProviderQueryParameters) => ({\n rows: serverOrders.slice((page - 1) * pageSize, page * pageSize),\n totalRows: serverOrders.length,\n});\n\n// The React wrapper calls `updateSettings` after every HotTable render. With\n// `dataProvider`, each call refetches the current page. Keep this object\n// stable, and write the selection status through a DOM ref so a checkbox\n// click does not re-render HotTable.\nconst dataProvider = {\n // the row selection keeps rows by this id, so it survives page changes\n rowId: 'id',\n fetchRows: fetchOrders,\n onRowsCreate: async() => {},\n onRowsUpdate: async() => {},\n onRowsRemove: async() => {},\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const outputRef = useRef(null);\n\n return (\n <>\n (rowData as Order).status !== 'Cancelled',\n }}\n afterRowSelectionChange={() => {\n const rowSelection = hotRef.current?.hotInstance?.getPlugin('rowSelection');\n\n if (rowSelection && outputRef.current) {\n // send this object to your server, which applies it to the rows it did not send\n outputRef.current.textContent = `${rowSelection.getSelectedCount()} selected: ${JSON.stringify(rowSelection.getServerSelection())}`;\n }\n }}\n autoWrapRow={true}\n autoWrapCol={true}\n />\n 0 selected\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/server-side-data-row-selection/react/example1.tsx","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__vue__example1.vue.json index 5fd59aa03..4ba939782 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data-row-selection__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Server-side row selection · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/server-side-data-row-selection/vue/example1.vue","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Server-side row selection · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/server-side-data-row-selection/vue/example1.vue","breadcrumb":["Getting Started","Server-side row selection"],"guide":"guides/getting-started/server-side-data-row-selection/server-side-data-row-selection.md","guideTitle":"Server-side row selection","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data-row-selection","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__angular__example1.ts.json index edf3da039..1e9b78214 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Server-side data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n RowUpdatePayload,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\ntype DataProviderFilterColumn = NonNullable[number];\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n { id: 1, product: 'Wireless ergonomic keyboard', sku: 'PER-KBD-901', category: 'Peripherals', unitPrice: 79.99, inStock: 210 },\n { id: 2, product: 'USB-C 7-port hub', sku: 'PER-HUB-707', category: 'Peripherals', unitPrice: 45.5, inStock: 88 },\n { id: 3, product: '27\" QHD monitor', sku: 'DSP-MON-270', category: 'Displays', unitPrice: 329, inStock: 42 },\n { id: 4, product: 'Laptop stand aluminum', sku: 'ACC-STD-112', category: 'Accessories', unitPrice: 39.99, inStock: 156 },\n { id: 5, product: 'Noise-cancelling headset', sku: 'AUD-HDS-440', category: 'Audio', unitPrice: 199, inStock: 67 },\n { id: 6, product: 'Mechanical keyboard MX Brown', sku: 'PER-KBD-303', category: 'Peripherals', unitPrice: 129, inStock: 94 },\n { id: 7, product: 'Webcam 1080p autofocus', sku: 'VID-CAM-108', category: 'Video', unitPrice: 89, inStock: 203 },\n { id: 8, product: 'Docking station Thunderbolt 4', sku: 'PER-DCK-401', category: 'Peripherals', unitPrice: 279, inStock: 31 },\n { id: 9, product: 'Portable SSD 1TB', sku: 'STO-SSD-1T', category: 'Storage', unitPrice: 119.99, inStock: 178 },\n { id: 10, product: 'Office chair mesh back', sku: 'FUR-CHR-882', category: 'Furniture', unitPrice: 349, inStock: 22 },\n { id: 11, product: 'LED desk lamp dimmable', sku: 'LGT-LMP-210', category: 'Lighting', unitPrice: 54.25, inStock: 115 },\n { id: 12, product: 'Bluetooth mouse silent', sku: 'PER-MSE-055', category: 'Peripherals', unitPrice: 32.99, inStock: 340 },\n { id: 13, product: 'HDMI 2.1 cable 2m', sku: 'CBL-HDM-200', category: 'Cables', unitPrice: 18.99, inStock: 512 },\n { id: 14, product: 'USB-C PD charger 65W', sku: 'PWR-PD65-W', category: 'Power', unitPrice: 49, inStock: 189 },\n { id: 15, product: 'Mesh Wi-Fi router', sku: 'NET-RT-M1', category: 'Networking', unitPrice: 159, inStock: 58 },\n { id: 16, product: 'External HDD 4TB', sku: 'STO-HDD-4T', category: 'Storage', unitPrice: 99.5, inStock: 76 },\n { id: 17, product: 'Graphics tablet medium', sku: 'CRT-TAB-M2', category: 'Creative', unitPrice: 249, inStock: 41 },\n { id: 18, product: 'Microphone USB condenser', sku: 'AUD-MIC-U1', category: 'Audio', unitPrice: 74.99, inStock: 99 },\n { id: 19, product: 'Privacy screen 14\"', sku: 'ACC-PRV-140', category: 'Accessories', unitPrice: 42, inStock: 133 },\n { id: 20, product: 'Surge protector 8-outlet', sku: 'PWR-SRG-808', category: 'Power', unitPrice: 28.75, inStock: 267 },\n { id: 21, product: 'FHD portable monitor 15.6\"', sku: 'DSP-MON-156', category: 'Displays', unitPrice: 189, inStock: 48 },\n { id: 22, product: 'Ethernet cable Cat6 5m', sku: 'CBL-ETH-500', category: 'Cables', unitPrice: 12.5, inStock: 620 },\n { id: 23, product: 'Laptop sleeve 15\"', sku: 'ACC-SLV-150', category: 'Accessories', unitPrice: 35, inStock: 201 },\n { id: 24, product: 'Smart power strip', sku: 'PWR-STR-S1', category: 'Power', unitPrice: 59.99, inStock: 71 },\n { id: 25, product: 'Ring light 12\" with stand', sku: 'LGT-RNG-120', category: 'Lighting', unitPrice: 65, inStock: 84 },\n { id: 26, product: 'NVMe enclosure USB4', sku: 'STO-ENC-NV', category: 'Storage', unitPrice: 79, inStock: 55 },\n { id: 27, product: 'Vertical mouse', sku: 'PER-MSE-VER', category: 'Peripherals', unitPrice: 56.5, inStock: 112 },\n { id: 28, product: 'Conference speakerphone', sku: 'AUD-SPK-CF', category: 'Audio', unitPrice: 189.99, inStock: 36 },\n];\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(row: DemoRow, colFilter: DataProviderFilterColumn): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(rows: DemoRow[], filters: DataProviderFilterColumn[] | null): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
    \n
    \n \n \n
    \n {{ fetchStatus }}\n
    \n
    \n \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild('hot') private hotTable?: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n fetchStatus = 'Initializing…';\n\n private readonly inventoryServer = createInventoryDemoServer();\n\n readonly hotSettings: GridSettings;\n\n /** Defers binding updates so sync data-provider hooks do not trigger NG0100 in dev mode. */\n private setFetchStatus(message: string): void {\n setTimeout(() => {\n this.fetchStatus = message;\n this.cdr.markForCheck();\n }, 0);\n }\n\n constructor() {\n const server = this.inventoryServer;\n\n this.hotSettings = {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows.bind(server),\n onRowsCreate: server.onRowsCreate.bind(server),\n onRowsUpdate: server.onRowsUpdate.bind(server),\n onRowsRemove: server.onRowsRemove.bind(server),\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n { data: 'unitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n this.setFetchStatus(\n params.skipLoading\n ? 'Updating after sort or edit…'\n : 'Loading data…'\n );\n },\n afterDataProviderFetch: () => {\n this.setFetchStatus(`Ready (simulated ${LATENCY_MS}ms request).`);\n },\n afterDataProviderFetchError: (error: Error) => {\n this.setFetchStatus(`Could not load data: ${error.message}`);\n },\n };\n }\n\n reloadFetch(): void {\n this.inventoryServer.clearFailNextFetch();\n void this.hotTable?.hotInstance?.getPlugin('dataProvider')?.fetchData()?.catch(() => {});\n }\n\n simulateFailedFetch(): void {\n this.inventoryServer.setFailNextFetch();\n void this.hotTable?.hotInstance?.getPlugin('dataProvider')?.fetchData()?.catch(() => {});\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/server-side-data/angular/example1.ts","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Server-side data · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n RowUpdatePayload,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\ntype DataProviderFilterColumn = NonNullable[number];\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n { id: 1, product: 'Wireless ergonomic keyboard', sku: 'PER-KBD-901', category: 'Peripherals', unitPrice: 79.99, inStock: 210 },\n { id: 2, product: 'USB-C 7-port hub', sku: 'PER-HUB-707', category: 'Peripherals', unitPrice: 45.5, inStock: 88 },\n { id: 3, product: '27\" QHD monitor', sku: 'DSP-MON-270', category: 'Displays', unitPrice: 329, inStock: 42 },\n { id: 4, product: 'Laptop stand aluminum', sku: 'ACC-STD-112', category: 'Accessories', unitPrice: 39.99, inStock: 156 },\n { id: 5, product: 'Noise-cancelling headset', sku: 'AUD-HDS-440', category: 'Audio', unitPrice: 199, inStock: 67 },\n { id: 6, product: 'Mechanical keyboard MX Brown', sku: 'PER-KBD-303', category: 'Peripherals', unitPrice: 129, inStock: 94 },\n { id: 7, product: 'Webcam 1080p autofocus', sku: 'VID-CAM-108', category: 'Video', unitPrice: 89, inStock: 203 },\n { id: 8, product: 'Docking station Thunderbolt 4', sku: 'PER-DCK-401', category: 'Peripherals', unitPrice: 279, inStock: 31 },\n { id: 9, product: 'Portable SSD 1TB', sku: 'STO-SSD-1T', category: 'Storage', unitPrice: 119.99, inStock: 178 },\n { id: 10, product: 'Office chair mesh back', sku: 'FUR-CHR-882', category: 'Furniture', unitPrice: 349, inStock: 22 },\n { id: 11, product: 'LED desk lamp dimmable', sku: 'LGT-LMP-210', category: 'Lighting', unitPrice: 54.25, inStock: 115 },\n { id: 12, product: 'Bluetooth mouse silent', sku: 'PER-MSE-055', category: 'Peripherals', unitPrice: 32.99, inStock: 340 },\n { id: 13, product: 'HDMI 2.1 cable 2m', sku: 'CBL-HDM-200', category: 'Cables', unitPrice: 18.99, inStock: 512 },\n { id: 14, product: 'USB-C PD charger 65W', sku: 'PWR-PD65-W', category: 'Power', unitPrice: 49, inStock: 189 },\n { id: 15, product: 'Mesh Wi-Fi router', sku: 'NET-RT-M1', category: 'Networking', unitPrice: 159, inStock: 58 },\n { id: 16, product: 'External HDD 4TB', sku: 'STO-HDD-4T', category: 'Storage', unitPrice: 99.5, inStock: 76 },\n { id: 17, product: 'Graphics tablet medium', sku: 'CRT-TAB-M2', category: 'Creative', unitPrice: 249, inStock: 41 },\n { id: 18, product: 'Microphone USB condenser', sku: 'AUD-MIC-U1', category: 'Audio', unitPrice: 74.99, inStock: 99 },\n { id: 19, product: 'Privacy screen 14\"', sku: 'ACC-PRV-140', category: 'Accessories', unitPrice: 42, inStock: 133 },\n { id: 20, product: 'Surge protector 8-outlet', sku: 'PWR-SRG-808', category: 'Power', unitPrice: 28.75, inStock: 267 },\n { id: 21, product: 'FHD portable monitor 15.6\"', sku: 'DSP-MON-156', category: 'Displays', unitPrice: 189, inStock: 48 },\n { id: 22, product: 'Ethernet cable Cat6 5m', sku: 'CBL-ETH-500', category: 'Cables', unitPrice: 12.5, inStock: 620 },\n { id: 23, product: 'Laptop sleeve 15\"', sku: 'ACC-SLV-150', category: 'Accessories', unitPrice: 35, inStock: 201 },\n { id: 24, product: 'Smart power strip', sku: 'PWR-STR-S1', category: 'Power', unitPrice: 59.99, inStock: 71 },\n { id: 25, product: 'Ring light 12\" with stand', sku: 'LGT-RNG-120', category: 'Lighting', unitPrice: 65, inStock: 84 },\n { id: 26, product: 'NVMe enclosure USB4', sku: 'STO-ENC-NV', category: 'Storage', unitPrice: 79, inStock: 55 },\n { id: 27, product: 'Vertical mouse', sku: 'PER-MSE-VER', category: 'Peripherals', unitPrice: 56.5, inStock: 112 },\n { id: 28, product: 'Conference speakerphone', sku: 'AUD-SPK-CF', category: 'Audio', unitPrice: 189.99, inStock: 36 },\n];\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(row: DemoRow, colFilter: DataProviderFilterColumn): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(rows: DemoRow[], filters: DataProviderFilterColumn[] | null): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
    \n
    \n \n \n
    \n {{ fetchStatus }}\n
    \n
    \n \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild('hot') private hotTable?: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n fetchStatus = 'Initializing…';\n\n private readonly inventoryServer = createInventoryDemoServer();\n\n readonly hotSettings: GridSettings;\n\n /** Defers binding updates so sync data-provider hooks do not trigger NG0100 in dev mode. */\n private setFetchStatus(message: string): void {\n setTimeout(() => {\n this.fetchStatus = message;\n this.cdr.markForCheck();\n }, 0);\n }\n\n constructor() {\n const server = this.inventoryServer;\n\n this.hotSettings = {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows.bind(server),\n onRowsCreate: server.onRowsCreate.bind(server),\n onRowsUpdate: server.onRowsUpdate.bind(server),\n onRowsRemove: server.onRowsRemove.bind(server),\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n { data: 'unitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n this.setFetchStatus(\n params.skipLoading\n ? 'Updating after sort or edit…'\n : 'Loading data…'\n );\n },\n afterDataProviderFetch: () => {\n this.setFetchStatus(`Ready (simulated ${LATENCY_MS}ms request).`);\n },\n afterDataProviderFetchError: (error: Error) => {\n this.setFetchStatus(`Could not load data: ${error.message}`);\n },\n };\n }\n\n reloadFetch(): void {\n this.inventoryServer.clearFailNextFetch();\n void this.hotTable?.hotInstance?.getPlugin('dataProvider')?.fetchData()?.catch(() => {});\n }\n\n simulateFailedFetch(): void {\n this.inventoryServer.setFailNextFetch();\n void this.hotTable?.hotInstance?.getPlugin('dataProvider')?.fetchData()?.catch(() => {});\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/server-side-data/angular/example1.ts","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.js.json index a311e05ad..9b0fe634d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Server-side data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Initializing\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst LATENCY_MS = 450;\nconst SEED_CATALOG = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction asLowerString(cell) {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell, cond) {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(row, colFilter) {\n const value = row[colFilter.prop];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(rows, filters) {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms, signal) {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\nfunction createInventoryDemoServer() {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop];\n const bv = b[sort.prop];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n// =============================================================================\n// Grid — Handsontable options, hooks, and demo toolbar.\n// =============================================================================\nconst server = createInventoryDemoServer();\nconst statusEl = document.querySelector('#example1-status');\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n {\n data: 'unitPrice',\n type: 'numeric',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 },\n },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n licenseKey: 'non-commercial-and-evaluation',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params) => {\n if (statusEl) {\n statusEl.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n afterDataProviderFetch: () => {\n if (statusEl) {\n statusEl.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n },\n afterDataProviderFetchError: (error) => {\n if (statusEl) {\n statusEl.textContent = `Could not load data: ${error.message}`;\n }\n },\n});\n\nfunction runFetch(clearFail) {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hot.getPlugin('dataProvider').fetchData();\n\n void p.catch(() => {});\n}\n\ndocument.querySelector('#example1-reload')?.addEventListener('click', () => runFetch(true));\ndocument.querySelector('#example1-fail-fetch')?.addEventListener('click', () => runFetch(false));","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/server-side-data/javascript/example1.js","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Server-side data · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Initializing\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst LATENCY_MS = 450;\nconst SEED_CATALOG = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction asLowerString(cell) {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell, cond) {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(row, colFilter) {\n const value = row[colFilter.prop];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(rows, filters) {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms, signal) {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\nfunction createInventoryDemoServer() {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop];\n const bv = b[sort.prop];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n// =============================================================================\n// Grid — Handsontable options, hooks, and demo toolbar.\n// =============================================================================\nconst server = createInventoryDemoServer();\nconst statusEl = document.querySelector('#example1-status');\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n {\n data: 'unitPrice',\n type: 'numeric',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 },\n },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n licenseKey: 'non-commercial-and-evaluation',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params) => {\n if (statusEl) {\n statusEl.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n afterDataProviderFetch: () => {\n if (statusEl) {\n statusEl.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n },\n afterDataProviderFetchError: (error) => {\n if (statusEl) {\n statusEl.textContent = `Could not load data: ${error.message}`;\n }\n },\n});\n\nfunction runFetch(clearFail) {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hot.getPlugin('dataProvider').fetchData();\n\n void p.catch(() => {});\n}\n\ndocument.querySelector('#example1-reload')?.addEventListener('click', () => runFetch(true));\ndocument.querySelector('#example1-fail-fetch')?.addEventListener('click', () => runFetch(false));","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/getting-started/server-side-data/javascript/example1.js","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.ts.json index cb471487f..6278434ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Server-side data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Initializing\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n RowUpdatePayload,\n} from 'handsontable/plugins/dataProvider';\n\ntype DataProviderFilterColumn = NonNullable[number];\n\nregisterAllModules();\n\n// =============================================================================\n// In-memory \"server\" — replace with REST/GraphQL clients in production.\n// =============================================================================\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(\n row: DemoRow,\n colFilter: DataProviderFilterColumn\n): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(\n rows: DemoRow[],\n filters: DataProviderFilterColumn[] | null\n): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n// =============================================================================\n// Grid — Handsontable options, hooks, and demo toolbar.\n// =============================================================================\n\nconst server = createInventoryDemoServer();\nconst statusEl = document.querySelector('#example1-status');\nconst container = document.querySelector('#example1') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n {\n data: 'unitPrice',\n type: 'numeric',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 },\n },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n licenseKey: 'non-commercial-and-evaluation',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n if (statusEl) {\n statusEl.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n afterDataProviderFetch: () => {\n if (statusEl) {\n statusEl.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n },\n afterDataProviderFetchError: (error: Error) => {\n if (statusEl) {\n statusEl.textContent = `Could not load data: ${error.message}`;\n }\n },\n});\n\nfunction runFetch(clearFail: boolean) {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hot.getPlugin('dataProvider').fetchData();\n\n void p.catch(() => {});\n}\n\ndocument.querySelector('#example1-reload')?.addEventListener('click', () => runFetch(true));\ndocument.querySelector('#example1-fail-fetch')?.addEventListener('click', () => runFetch(false));","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/server-side-data/javascript/example1.ts","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Server-side data · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Initializing\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n RowUpdatePayload,\n} from 'handsontable/plugins/dataProvider';\n\ntype DataProviderFilterColumn = NonNullable[number];\n\nregisterAllModules();\n\n// =============================================================================\n// In-memory \"server\" — replace with REST/GraphQL clients in production.\n// =============================================================================\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(\n row: DemoRow,\n colFilter: DataProviderFilterColumn\n): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(\n rows: DemoRow[],\n filters: DataProviderFilterColumn[] | null\n): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\n// =============================================================================\n// Grid — Handsontable options, hooks, and demo toolbar.\n// =============================================================================\n\nconst server = createInventoryDemoServer();\nconst statusEl = document.querySelector('#example1-status');\nconst container = document.querySelector('#example1') as HTMLElement;\n\nconst hot = new Handsontable(container, {\n dataProvider: {\n rowId: 'id',\n fetchRows: server.fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n },\n columns: [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n {\n data: 'unitPrice',\n type: 'numeric',\n numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 },\n },\n { data: 'inStock', type: 'numeric' },\n ],\n rowHeaders: true,\n colHeaders: ['Product', 'SKU', 'Category', 'Unit price', 'In stock'],\n width: '100%',\n height: '300px',\n licenseKey: 'non-commercial-and-evaluation',\n columnSorting: true,\n pagination: true,\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n emptyDataState: true,\n notification: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n if (statusEl) {\n statusEl.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n afterDataProviderFetch: () => {\n if (statusEl) {\n statusEl.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n },\n afterDataProviderFetchError: (error: Error) => {\n if (statusEl) {\n statusEl.textContent = `Could not load data: ${error.message}`;\n }\n },\n});\n\nfunction runFetch(clearFail: boolean) {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hot.getPlugin('dataProvider').fetchData();\n\n void p.catch(() => {});\n}\n\ndocument.querySelector('#example1-reload')?.addEventListener('click', () => runFetch(true));\ndocument.querySelector('#example1-fail-fetch')?.addEventListener('click', () => runFetch(false));","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/getting-started/server-side-data/javascript/example1.ts","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__react__example1.tsx.json index 35e9b45dd..93b7d35b7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Server-side data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { memo, useCallback, useMemo, useRef } from 'react';\nimport { HotTable, type HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n DataProviderFilterColumn,\n RowUpdatePayload,\n} from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(\n row: DemoRow,\n colFilter: DataProviderFilterColumn\n): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(\n rows: DemoRow[],\n filters: DataProviderFilterColumn[] | null\n): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\nconst columns = [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n { data: 'unitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'inStock', type: 'numeric' },\n];\n\nconst colHeaders = ['Product', 'SKU', 'Category', 'Unit price', 'In stock'];\n\ntype InventoryServerTableProps = {\n statusRef: React.RefObject;\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => void;\n afterDataProviderFetch: () => void;\n afterDataProviderFetchError: (error: Error) => void;\n};\n\n/**\n * Renders HotTable in isolation to avoid a fetch loop.\n * The React wrapper calls `updateSettings` after every HotTable render. With `dataProvider`,\n * each `updateSettings` call re-triggers a fetch. Status is therefore updated via a DOM ref\n * rather than React state so that status changes never cause HotTable to re-render.\n */\nconst InventoryServerTable = memo(function InventoryServerTable({\n statusRef,\n beforeDataProviderFetch,\n afterDataProviderFetch,\n afterDataProviderFetchError,\n}: InventoryServerTableProps) {\n const hotRef = useRef(null);\n const server = useMemo(() => createInventoryDemoServer(), []);\n\n const fetchRows = useCallback(\n (queryParameters: DataProviderQueryParameters, options: DataProviderFetchOptions) =>\n server.fetchRows(queryParameters, options),\n [server]\n );\n\n const dataProvider = useMemo(\n () => ({\n rowId: 'id',\n fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n }),\n [fetchRows, server]\n );\n\n const runFetch = useCallback(\n (clearFail: boolean) => {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hotRef.current?.hotInstance?.getPlugin('dataProvider')?.fetchData();\n\n if (p) {\n void p.catch(() => {});\n }\n },\n [server]\n );\n\n return (\n <>\n
    \n
    \n \n \n
    \n Initializing…\n
    \n
    \n \n
    \n \n );\n});\n\nconst ExampleComponent = () => {\n const statusRef = useRef(null);\n\n const beforeDataProviderFetch = useCallback(\n (params: DataProviderBeforeFetchParameters) => {\n if (statusRef.current) {\n statusRef.current.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n []\n );\n\n const afterDataProviderFetch = useCallback(() => {\n if (statusRef.current) {\n statusRef.current.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n }, []);\n\n const afterDataProviderFetchError = useCallback((error: Error) => {\n if (statusRef.current) {\n statusRef.current.textContent = `Could not load data: ${error.message}`;\n }\n }, []);\n\n return (\n <>\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/server-side-data/react/example1.tsx","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Server-side data · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import React, { memo, useCallback, useMemo, useRef } from 'react';\nimport { HotTable, type HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n DataProviderFilterColumn,\n RowUpdatePayload,\n} from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype DemoRow = {\n id: number;\n product: string;\n sku: string;\n category: string;\n unitPrice: number;\n inStock: number;\n};\n\ntype FilterCondition = { name?: string; args?: unknown[] };\n\nconst LATENCY_MS = 450;\n\nconst SEED_CATALOG: readonly DemoRow[] = [\n {\n id: 1,\n product: 'Wireless ergonomic keyboard',\n sku: 'PER-KBD-901',\n category: 'Peripherals',\n unitPrice: 79.99,\n inStock: 210,\n },\n {\n id: 2,\n product: 'USB-C 7-port hub',\n sku: 'PER-HUB-707',\n category: 'Peripherals',\n unitPrice: 45.5,\n inStock: 88,\n },\n {\n id: 3,\n product: '27\" QHD monitor',\n sku: 'DSP-MON-270',\n category: 'Displays',\n unitPrice: 329,\n inStock: 42,\n },\n {\n id: 4,\n product: 'Laptop stand aluminum',\n sku: 'ACC-STD-112',\n category: 'Accessories',\n unitPrice: 39.99,\n inStock: 156,\n },\n {\n id: 5,\n product: 'Noise-cancelling headset',\n sku: 'AUD-HDS-440',\n category: 'Audio',\n unitPrice: 199,\n inStock: 67,\n },\n {\n id: 6,\n product: 'Mechanical keyboard MX Brown',\n sku: 'PER-KBD-303',\n category: 'Peripherals',\n unitPrice: 129,\n inStock: 94,\n },\n {\n id: 7,\n product: 'Webcam 1080p autofocus',\n sku: 'VID-CAM-108',\n category: 'Video',\n unitPrice: 89,\n inStock: 203,\n },\n {\n id: 8,\n product: 'Docking station Thunderbolt 4',\n sku: 'PER-DCK-401',\n category: 'Peripherals',\n unitPrice: 279,\n inStock: 31,\n },\n {\n id: 9,\n product: 'Portable SSD 1TB',\n sku: 'STO-SSD-1T',\n category: 'Storage',\n unitPrice: 119.99,\n inStock: 178,\n },\n {\n id: 10,\n product: 'Office chair mesh back',\n sku: 'FUR-CHR-882',\n category: 'Furniture',\n unitPrice: 349,\n inStock: 22,\n },\n {\n id: 11,\n product: 'LED desk lamp dimmable',\n sku: 'LGT-LMP-210',\n category: 'Lighting',\n unitPrice: 54.25,\n inStock: 115,\n },\n {\n id: 12,\n product: 'Bluetooth mouse silent',\n sku: 'PER-MSE-055',\n category: 'Peripherals',\n unitPrice: 32.99,\n inStock: 340,\n },\n {\n id: 13,\n product: 'HDMI 2.1 cable 2m',\n sku: 'CBL-HDM-200',\n category: 'Cables',\n unitPrice: 18.99,\n inStock: 512,\n },\n {\n id: 14,\n product: 'USB-C PD charger 65W',\n sku: 'PWR-PD65-W',\n category: 'Power',\n unitPrice: 49,\n inStock: 189,\n },\n {\n id: 15,\n product: 'Mesh Wi-Fi router',\n sku: 'NET-RT-M1',\n category: 'Networking',\n unitPrice: 159,\n inStock: 58,\n },\n {\n id: 16,\n product: 'External HDD 4TB',\n sku: 'STO-HDD-4T',\n category: 'Storage',\n unitPrice: 99.5,\n inStock: 76,\n },\n {\n id: 17,\n product: 'Graphics tablet medium',\n sku: 'CRT-TAB-M2',\n category: 'Creative',\n unitPrice: 249,\n inStock: 41,\n },\n {\n id: 18,\n product: 'Microphone USB condenser',\n sku: 'AUD-MIC-U1',\n category: 'Audio',\n unitPrice: 74.99,\n inStock: 99,\n },\n {\n id: 19,\n product: 'Privacy screen 14\"',\n sku: 'ACC-PRV-140',\n category: 'Accessories',\n unitPrice: 42,\n inStock: 133,\n },\n {\n id: 20,\n product: 'Surge protector 8-outlet',\n sku: 'PWR-SRG-808',\n category: 'Power',\n unitPrice: 28.75,\n inStock: 267,\n },\n {\n id: 21,\n product: 'FHD portable monitor 15.6\"',\n sku: 'DSP-MON-156',\n category: 'Displays',\n unitPrice: 189,\n inStock: 48,\n },\n {\n id: 22,\n product: 'Ethernet cable Cat6 5m',\n sku: 'CBL-ETH-500',\n category: 'Cables',\n unitPrice: 12.5,\n inStock: 620,\n },\n {\n id: 23,\n product: 'Laptop sleeve 15\"',\n sku: 'ACC-SLV-150',\n category: 'Accessories',\n unitPrice: 35,\n inStock: 201,\n },\n {\n id: 24,\n product: 'Smart power strip',\n sku: 'PWR-STR-S1',\n category: 'Power',\n unitPrice: 59.99,\n inStock: 71,\n },\n {\n id: 25,\n product: 'Ring light 12\" with stand',\n sku: 'LGT-RNG-120',\n category: 'Lighting',\n unitPrice: 65,\n inStock: 84,\n },\n {\n id: 26,\n product: 'NVMe enclosure USB4',\n sku: 'STO-ENC-NV',\n category: 'Storage',\n unitPrice: 79,\n inStock: 55,\n },\n {\n id: 27,\n product: 'Vertical mouse',\n sku: 'PER-MSE-VER',\n category: 'Peripherals',\n unitPrice: 56.5,\n inStock: 112,\n },\n {\n id: 28,\n product: 'Conference speakerphone',\n sku: 'AUD-SPK-CF',\n category: 'Audio',\n unitPrice: 189.99,\n inStock: 36,\n },\n];\n\nfunction delay(ms: number, signal: AbortSignal): Promise {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new DOMException('Aborted', 'AbortError'));\n\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException('Aborted', 'AbortError'));\n },\n { once: true }\n );\n });\n}\n\nfunction asLowerString(cell: unknown): string {\n if (cell === null || cell === undefined) {\n return '';\n }\n\n return String(cell).toLowerCase();\n}\n\nfunction matchesCondition(cell: unknown, cond: FilterCondition): boolean {\n const args = Array.isArray(cond.args) ? cond.args : [];\n const name = cond.name;\n\n if (!name || name === 'none') {\n return true;\n }\n\n switch (name) {\n case 'eq':\n return asLowerString(cell) === asLowerString(args[0]);\n case 'neq':\n return asLowerString(cell) !== asLowerString(args[0]);\n case 'contains':\n return asLowerString(cell).includes(asLowerString(args[0]));\n case 'not_contains':\n return !asLowerString(cell).includes(asLowerString(args[0]));\n case 'begins_with':\n return asLowerString(cell).startsWith(asLowerString(args[0]));\n case 'ends_with':\n return asLowerString(cell).endsWith(asLowerString(args[0]));\n case 'gt':\n return Number(cell) > Number(args[0]);\n case 'gte':\n return Number(cell) >= Number(args[0]);\n case 'lt':\n return Number(cell) < Number(args[0]);\n case 'lte':\n return Number(cell) <= Number(args[0]);\n case 'between':\n return Number(cell) >= Number(args[0]) && Number(cell) <= Number(args[1]);\n case 'not_between':\n return Number(cell) < Number(args[0]) || Number(cell) > Number(args[1]);\n case 'empty':\n return cell === null || cell === undefined || String(cell) === '';\n case 'not_empty':\n return cell !== null && cell !== undefined && String(cell) !== '';\n default:\n return true;\n }\n}\n\nfunction rowMatchesFilterColumn(\n row: DemoRow,\n colFilter: DataProviderFilterColumn\n): boolean {\n const value = row[colFilter.prop as keyof DemoRow];\n const conditions = colFilter.conditions ?? [];\n const op = colFilter.operation ?? 'conjunction';\n\n if (conditions.length === 0) {\n return true;\n }\n\n const parts = conditions.map((c) => () => matchesCondition(value, c));\n\n if (op === 'disjunction') {\n return parts.some((fn) => fn());\n }\n\n if (op === 'disjunctionWithExtraCondition' && parts.length >= 3) {\n return parts.slice(0, -1).some((fn) => fn()) && parts[parts.length - 1]();\n }\n\n return parts.every((fn) => fn());\n}\n\nfunction applyQueryFilters(\n rows: DemoRow[],\n filters: DataProviderFilterColumn[] | null\n): DemoRow[] {\n if (!filters || filters.length === 0) {\n return rows;\n }\n\n return rows.filter((row) => filters.every((f) => rowMatchesFilterColumn(row, f)));\n}\n\ntype InventoryDemoServer = {\n clearFailNextFetch: () => void;\n setFailNextFetch: () => void;\n fetchRows: (\n queryParameters: DataProviderQueryParameters,\n options: DataProviderFetchOptions\n ) => Promise<{ rows: DemoRow[]; totalRows: number }>;\n onRowsCreate: (payload: {\n rowsAmount: number;\n position: 'above' | 'below';\n referenceRowId?: unknown;\n }) => Promise;\n onRowsUpdate: (rows: RowUpdatePayload[]) => Promise;\n onRowsRemove: (rowIds: unknown[]) => Promise;\n};\n\nfunction createInventoryDemoServer(): InventoryDemoServer {\n const store = {\n nextId: SEED_CATALOG.reduce((max, r) => Math.max(max, r.id), 0),\n rows: SEED_CATALOG.map((r) => ({ ...r })),\n };\n\n let failNextFetch = false;\n\n return {\n clearFailNextFetch() {\n failNextFetch = false;\n },\n setFailNextFetch() {\n failNextFetch = true;\n },\n fetchRows(queryParameters, { signal }) {\n const { page, pageSize, sort, filters } = queryParameters;\n let rows = [...store.rows];\n\n if (sort) {\n rows.sort((a, b) => {\n const av = a[sort.prop as keyof DemoRow];\n const bv = b[sort.prop as keyof DemoRow];\n let cmp = 0;\n\n if (av < bv) {\n cmp = -1;\n } else if (av > bv) {\n cmp = 1;\n }\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n rows = applyQueryFilters(rows, filters);\n\n const start = (page - 1) * pageSize;\n const pageRows = rows.slice(start, start + pageSize);\n\n return delay(LATENCY_MS, signal).then(() => {\n if (signal.aborted) {\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n\n if (failNextFetch) {\n failNextFetch = false;\n\n return Promise.reject(new Error('Simulated server error (for example HTTP 503).'));\n }\n\n return {\n rows: pageRows,\n totalRows: rows.length,\n };\n });\n },\n async onRowsCreate({ rowsAmount, position, referenceRowId }) {\n const newRows: DemoRow[] = [];\n\n for (let i = 0; i < rowsAmount; i += 1) {\n store.nextId += 1;\n newRows.push({\n id: store.nextId,\n product: 'New product',\n sku: `NEW-${store.nextId}`,\n category: 'Uncategorized',\n unitPrice: 0,\n inStock: 0,\n });\n }\n\n let insertAt = store.rows.length;\n\n if (referenceRowId !== undefined && referenceRowId !== null) {\n const refIdx = store.rows.findIndex((r) => r.id === referenceRowId);\n\n if (refIdx >= 0) {\n insertAt = position === 'above' ? refIdx : refIdx + 1;\n }\n }\n\n store.rows.splice(insertAt, 0, ...newRows);\n },\n async onRowsUpdate(rows) {\n rows.forEach(({ id, changes }) => {\n const row = store.rows.find((r) => r.id === id);\n\n if (row) {\n Object.assign(row, changes);\n }\n });\n },\n async onRowsRemove(rowIds) {\n const idSet = new Set(rowIds);\n\n store.rows = store.rows.filter((r) => !idSet.has(r.id));\n },\n };\n}\n\nconst columns = [\n { data: 'product' },\n { data: 'sku', readOnly: true },\n { data: 'category' },\n { data: 'unitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'inStock', type: 'numeric' },\n];\n\nconst colHeaders = ['Product', 'SKU', 'Category', 'Unit price', 'In stock'];\n\ntype InventoryServerTableProps = {\n statusRef: React.RefObject;\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => void;\n afterDataProviderFetch: () => void;\n afterDataProviderFetchError: (error: Error) => void;\n};\n\n/**\n * Renders HotTable in isolation to avoid a fetch loop.\n * The React wrapper calls `updateSettings` after every HotTable render. With `dataProvider`,\n * each `updateSettings` call re-triggers a fetch. Status is therefore updated via a DOM ref\n * rather than React state so that status changes never cause HotTable to re-render.\n */\nconst InventoryServerTable = memo(function InventoryServerTable({\n statusRef,\n beforeDataProviderFetch,\n afterDataProviderFetch,\n afterDataProviderFetchError,\n}: InventoryServerTableProps) {\n const hotRef = useRef(null);\n const server = useMemo(() => createInventoryDemoServer(), []);\n\n const fetchRows = useCallback(\n (queryParameters: DataProviderQueryParameters, options: DataProviderFetchOptions) =>\n server.fetchRows(queryParameters, options),\n [server]\n );\n\n const dataProvider = useMemo(\n () => ({\n rowId: 'id',\n fetchRows,\n onRowsCreate: server.onRowsCreate,\n onRowsUpdate: server.onRowsUpdate,\n onRowsRemove: server.onRowsRemove,\n }),\n [fetchRows, server]\n );\n\n const runFetch = useCallback(\n (clearFail: boolean) => {\n if (clearFail) {\n server.clearFailNextFetch();\n } else {\n server.setFailNextFetch();\n }\n\n const p = hotRef.current?.hotInstance?.getPlugin('dataProvider')?.fetchData();\n\n if (p) {\n void p.catch(() => {});\n }\n },\n [server]\n );\n\n return (\n <>\n
    \n
    \n \n \n
    \n Initializing…\n
    \n
    \n \n
    \n \n );\n});\n\nconst ExampleComponent = () => {\n const statusRef = useRef(null);\n\n const beforeDataProviderFetch = useCallback(\n (params: DataProviderBeforeFetchParameters) => {\n if (statusRef.current) {\n statusRef.current.textContent = params.skipLoading ? 'Updating after sort or edit…' : 'Loading data…';\n }\n },\n []\n );\n\n const afterDataProviderFetch = useCallback(() => {\n if (statusRef.current) {\n statusRef.current.textContent = `Ready (simulated ${LATENCY_MS}ms request).`;\n }\n }, []);\n\n const afterDataProviderFetchError = useCallback((error: Error) => {\n if (statusRef.current) {\n statusRef.current.textContent = `Could not load data: ${error.message}`;\n }\n }, []);\n\n return (\n <>\n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/getting-started/server-side-data/react/example1.tsx","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__vue__example1.vue.json index dc773bbcc..4aabaa613 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__server-side-data__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Server-side data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/server-side-data/vue/example1.vue","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Server-side data · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/server-side-data/vue/example1.vue","breadcrumb":["Getting Started","Server-side data"],"guide":"guides/getting-started/server-side-data/server-side-data.md","guideTitle":"Server-side data","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/server-side-data","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__angular__example1.ts.json index 7ee1e7be8..986d4a303 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Getting Started ▸ Save and restore the view state · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
    \n \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, ViewEncapsulation, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-view-state',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n \n \n
    \n {{ output }}\n
    \n
    \n \n
    \n `,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // The saved view is plain JSON, so you can keep it in a field, `localStorage`, or on a server.\n private savedView: string | null = null;\n\n output = 'Sort, filter, hide, or resize columns, then click \"Save view\"';\n\n readonly gridSettings: GridSettings = {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n };\n\n saveClickCallback(): void {\n const hot = this.hotTable.hotInstance!;\n\n this.savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n this.output = 'View saved';\n this.cdr.markForCheck();\n }\n\n restoreClickCallback(): void {\n const hot = this.hotTable.hotInstance!;\n\n if (this.savedView === null) {\n this.output = 'Save a view first';\n this.cdr.markForCheck();\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(this.savedView));\n\n this.output = skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n this.cdr.markForCheck();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/view-state/angular/example1.ts","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"Angular"} +{"framework":"angular","displayName":"Getting Started ▸ Save and restore the view state · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n\n
    \n \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, ViewEncapsulation, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-view-state',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n \n \n
    \n {{ output }}\n
    \n
    \n \n
    \n `,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n // The saved view is plain JSON, so you can keep it in a field, `localStorage`, or on a server.\n private savedView: string | null = null;\n\n output = 'Sort, filter, hide, or resize columns, then click \"Save view\"';\n\n readonly gridSettings: GridSettings = {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n };\n\n saveClickCallback(): void {\n const hot = this.hotTable.hotInstance!;\n\n this.savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n this.output = 'View saved';\n this.cdr.markForCheck();\n }\n\n restoreClickCallback(): void {\n const hot = this.hotTable.hotInstance!;\n\n if (this.savedView === null) {\n this.output = 'Save a view first';\n this.cdr.markForCheck();\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(this.savedView));\n\n this.output = skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n this.cdr.markForCheck();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/getting-started/view-state/angular/example1.ts","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.js.json index 56a1b08b4..aaa4bbbe3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Getting Started ▸ Save and restore the view state · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n \n Sort, filter, hide, or resize columns, then click \"Save view\"\n
    \n \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst saveButton = document.querySelector('#save');\nconst restoreButton = document.querySelector('#restore');\nconst output = document.querySelector('#output');\n\n// The saved view is plain JSON, so you can keep it in a variable, `localStorage`, or on a server.\nlet savedView = null;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nsaveButton.addEventListener('click', () => {\n savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n output.textContent = 'View saved';\n});\n\nrestoreButton.addEventListener('click', () => {\n if (savedView === null) {\n output.textContent = 'Save a view first';\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView));\n\n output.textContent =\n skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/javascript/example1.js","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"JavaScript"} +{"framework":"javascript","displayName":"Getting Started ▸ Save and restore the view state · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n \n Sort, filter, hide, or resize columns, then click \"Save view\"\n
    \n \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst saveButton = document.querySelector('#save');\nconst restoreButton = document.querySelector('#restore');\nconst output = document.querySelector('#output');\n\n// The saved view is plain JSON, so you can keep it in a variable, `localStorage`, or on a server.\nlet savedView = null;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nsaveButton.addEventListener('click', () => {\n savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n output.textContent = 'View saved';\n});\n\nrestoreButton.addEventListener('click', () => {\n if (savedView === null) {\n output.textContent = 'Save a view first';\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView));\n\n output.textContent =\n skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/javascript/example1.js","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.ts.json index 2d0e9039b..7710992b5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Getting Started ▸ Save and restore the view state · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n \n Sort, filter, hide, or resize columns, then click \"Save view\"\n
    \n \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst saveButton = document.querySelector('#save')!;\nconst restoreButton = document.querySelector('#restore')!;\nconst output = document.querySelector('#output')!;\n\n// The saved view is plain JSON, so you can keep it in a variable, `localStorage`, or on a server.\nlet savedView: string | null = null;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nsaveButton.addEventListener('click', () => {\n savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n output.textContent = 'View saved';\n});\n\nrestoreButton.addEventListener('click', () => {\n if (savedView === null) {\n output.textContent = 'Save a view first';\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView));\n\n output.textContent = skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/javascript/example1.ts","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"TypeScript"} +{"framework":"typescript","displayName":"Getting Started ▸ Save and restore the view state · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n \n Sort, filter, hide, or resize columns, then click \"Save view\"\n
    \n \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst saveButton = document.querySelector('#save')!;\nconst restoreButton = document.querySelector('#restore')!;\nconst output = document.querySelector('#output')!;\n\n// The saved view is plain JSON, so you can keep it in a variable, `localStorage`, or on a server.\nlet savedView: string | null = null;\n\nconst hot = new Handsontable(container, {\n data: [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock', 'Rating'],\n rowHeaders: true,\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n contextMenu: true,\n hiddenColumns: { indicators: true },\n manualColumnResize: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nsaveButton.addEventListener('click', () => {\n savedView = JSON.stringify(hot.getPlugin('viewState').getViewState());\n output.textContent = 'View saved';\n});\n\nrestoreButton.addEventListener('click', () => {\n if (savedView === null) {\n output.textContent = 'Save a view first';\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView));\n\n output.textContent = skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`;\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/javascript/example1.ts","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__react__example1.tsx.json index 9a3594b10..40f3e6e4b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Getting Started ▸ Save and restore the view state · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotRef = useRef(null);\n // The saved view is plain JSON, so you can keep it in state, `localStorage`, or on a server.\n const savedView = useRef(null);\n const [output, setOutput] = useState('Sort, filter, hide, or resize columns, then click \"Save view\"');\n\n const saveClickCallback = () => {\n const hot = hotRef.current!.hotInstance!;\n\n savedView.current = JSON.stringify(hot.getPlugin('viewState').getViewState());\n setOutput('View saved');\n };\n\n const restoreClickCallback = () => {\n const hot = hotRef.current!.hotInstance!;\n\n if (savedView.current === null) {\n setOutput('Save a view first');\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView.current));\n\n setOutput(\n skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`\n );\n };\n\n return (\n <>\n
    \n
    \n \n \n
    \n \n {output}\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/react/example1.tsx","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"React (TS)"} +{"framework":"react","displayName":"Getting Started ▸ Save and restore the view state · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Laptop Pro 14', 'Computers', 1499, 24, 4.7],\n ['Wireless Mouse', 'Accessories', 29, 310, 4.4],\n ['Mechanical Keyboard', 'Accessories', 119, 85, 4.8],\n ['4K Monitor 27\"', 'Displays', 449, 41, 4.6],\n ['USB-C Dock', 'Accessories', 189, 67, 4.2],\n ['Tablet Air 11', 'Computers', 599, 52, 4.5],\n ['Webcam HD', 'Accessories', 79, 140, 4.1],\n ['Ultrawide Monitor 34\"', 'Displays', 799, 18, 4.9],\n];\n\nconst ExampleComponent: React.FC = () => {\n const hotRef = useRef(null);\n // The saved view is plain JSON, so you can keep it in state, `localStorage`, or on a server.\n const savedView = useRef(null);\n const [output, setOutput] = useState('Sort, filter, hide, or resize columns, then click \"Save view\"');\n\n const saveClickCallback = () => {\n const hot = hotRef.current!.hotInstance!;\n\n savedView.current = JSON.stringify(hot.getPlugin('viewState').getViewState());\n setOutput('View saved');\n };\n\n const restoreClickCallback = () => {\n const hot = hotRef.current!.hotInstance!;\n\n if (savedView.current === null) {\n setOutput('Save a view first');\n\n return;\n }\n\n const { skipped } = hot.getPlugin('viewState').setViewState(JSON.parse(savedView.current));\n\n setOutput(\n skipped.length === 0\n ? 'View restored'\n : `View restored, skipped: ${skipped.map(({ part, reason }) => `${part} (${reason})`).join(', ')}`\n );\n };\n\n return (\n <>\n
    \n
    \n \n \n
    \n \n {output}\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".controls {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n}"},"docsPath":"guides/getting-started/view-state/react/example1.tsx","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__vue__example1.vue.json index 8c2672a57..eeed3434c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__view-state__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Save and restore the view state · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/view-state/vue/example1.vue","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Save and restore the view state · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/view-state/vue/example1.vue","breadcrumb":["Getting Started","Save and restore the view state"],"guide":"guides/getting-started/view-state/view-state.md","guideTitle":"Save and restore the view state","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/view-state","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example1.vue.json index ce7d49da4..c2c3fff1a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example1.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-hot-column","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example1.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-hot-column","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example2.vue.json index c17f54d09..1fb87ed64 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example2.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/vue-hot-column","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Array of objects · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example2.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example2","exampleTitle":"Array of objects","docPermalink":"/vue-hot-column","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example3.vue.json index 1ee8184b5..11587867c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Declare a custom editor as a component · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example3.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example3","exampleTitle":"Declare a custom editor as a component","docPermalink":"/vue-hot-column","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Declare a custom editor as a component · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example3.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example3","exampleTitle":"Declare a custom editor as a component","docPermalink":"/vue-hot-column","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example4.vue.json index 4b8d595da..45ae0f9b4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Declare a custom renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example4.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example4","exampleTitle":"Declare a custom renderer","docPermalink":"/vue-hot-column","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Declare a custom renderer · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example4.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example4","exampleTitle":"Declare a custom renderer","docPermalink":"/vue-hot-column","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example5.vue.json index 29da7f0ab..51e818ae8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-column__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Render columns dynamically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example5.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example5","exampleTitle":"Render columns dynamically","docPermalink":"/vue-hot-column","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ HotColumn component · Render columns dynamically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-column/vue/example5.vue","breadcrumb":["Getting Started","HotColumn component"],"guide":"guides/getting-started/vue3-hot-column/vue3-hot-column.md","guideTitle":"HotColumn component","exampleId":"example5","exampleTitle":"Render columns dynamically","docPermalink":"/vue-hot-column","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-reference__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-reference__vue__example1.vue.json index 56ef7ec2e..fc60e5893 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-reference__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-hot-reference__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Instance reference · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-reference/vue/example1.vue","breadcrumb":["Getting Started","Instance reference"],"guide":"guides/getting-started/vue3-hot-reference/vue3-hot-reference.md","guideTitle":"Instance reference","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-instance-reference","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Instance reference · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/getting-started/vue3-hot-reference/vue/example1.vue","breadcrumb":["Getting Started","Instance reference"],"guide":"guides/getting-started/vue3-hot-reference/vue3-hot-reference.md","guideTitle":"Instance reference","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-instance-reference","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-pinia__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-pinia__vue__example1.vue.json index 8e7639df6..1e4ec2b4e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-pinia__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-pinia__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Pinia state management · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"pinia\": \"4.1.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/vue3-pinia/vue/example1.vue","breadcrumb":["Getting Started","Pinia state management"],"guide":"guides/getting-started/vue3-pinia/vue3-pinia.md","guideTitle":"Pinia state management","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-pinia","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Pinia state management · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"pinia\": \"4.1.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/vue3-pinia/vue/example1.vue","breadcrumb":["Getting Started","Pinia state management"],"guide":"guides/getting-started/vue3-pinia/vue3-pinia.md","guideTitle":"Pinia state management","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-pinia","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-vuex__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-vuex__vue__example1.vue.json index f0cb3f8cb..24fe66ac0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-vuex__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__getting-started__vue3-vuex__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Getting Started ▸ Vuex state management · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"vuex\": \"4.1.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/vue3-vuex/vue/example1.vue","breadcrumb":["Getting Started","Vuex state management"],"guide":"guides/getting-started/vue3-vuex/vue3-vuex.md","guideTitle":"Vuex state management","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-vuex","lang":"Vue 3"} +{"framework":"vue","displayName":"Getting Started ▸ Vuex state management · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"vuex\": \"4.1.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"guides/getting-started/vue3-vuex/vue/example1.vue","breadcrumb":["Getting Started","Vuex state management"],"guide":"guides/getting-started/vue3-vuex/vue3-vuex.md","guideTitle":"Vuex state management","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/vue-vuex","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__angular__example1.ts.json index 6afada3e3..855d7783e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Language · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { deDE, registerLanguageDictionary } from 'handsontable/i18n';\n\nregisterLanguageDictionary(deDE);\n\n@Component({\n selector: 'example1-language',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data: Array> = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n ];\n\n readonly gridSettings: GridSettings = {\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/language/angular/example1.ts","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Language · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { deDE, registerLanguageDictionary } from 'handsontable/i18n';\n\nregisterLanguageDictionary(deDE);\n\n@Component({\n selector: 'example1-language',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data: Array> = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n ];\n\n readonly gridSettings: GridSettings = {\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/language/angular/example1.ts","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.js.json index e35bd28f4..765024d43 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Language · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nregisterLanguageDictionary(deDE);\n\nconst container = document.querySelector('#example1');\nconst data = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nnew Handsontable(container, {\n data,\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/language/javascript/example1.js","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Language · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nregisterLanguageDictionary(deDE);\n\nconst container = document.querySelector('#example1');\nconst data = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nnew Handsontable(container, {\n data,\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/language/javascript/example1.js","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.ts.json index dbe714d9f..37386b737 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Language · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nregisterLanguageDictionary(deDE);\n\nconst container: Element = document.querySelector('#example1')!;\nconst data: [string, string, string, string, string, number][] = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nnew Handsontable(container, {\n data,\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/language/javascript/example1.ts","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Language · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nregisterLanguageDictionary(deDE);\n\nconst container: Element = document.querySelector('#example1')!;\nconst data: [string, string, string, string, string, number][] = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nnew Handsontable(container, {\n data,\n contextMenu: true,\n height: 'auto',\n language: 'de-DE',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/language/javascript/example1.ts","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__react__example1.tsx.json index 676e6766c..667732fc0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Language · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// register Handsontable's modules\nregisterAllModules();\nregisterLanguageDictionary(deDE);\n\nconst data = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/language/react/example1.tsx","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Language · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, deDE } from 'handsontable/i18n';\n\n// register Handsontable's modules\nregisterAllModules();\nregisterLanguageDictionary(deDE);\n\nconst data = [\n ['Lorem', 'ipsum', 'dolor', 'sit', '12/1/2015', 23],\n ['adipiscing', 'elit', 'Ut', 'imperdiet', '5/12/2015', 6],\n ['Pellentesque', 'vulputate', 'leo', 'semper', '10/23/2015', 26],\n ['diam', 'et', 'malesuada', 'libero', '12/1/2014', 98],\n ['orci', 'et', 'dignissim', 'hendrerit', '12/1/2016', 8.5],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/language/react/example1.tsx","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__vue__example1.vue.json index 99a675d9b..e0b684005 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__language__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Language · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/language/vue/example1.vue","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Language · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/language/vue/example1.vue","breadcrumb":["Internationalization","Language"],"guide":"guides/internationalization/language/language.md","guideTitle":"Language","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/language","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example1.ts.json index be5083b08..7ea833d22 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n// @ts-ignore\nimport { arAR, registerLanguageDictionary } from 'handsontable/i18n';\n\nregisterLanguageDictionary(arAR);\n\n@Component({\n selector: 'example1-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data = this.generateArabicData();\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl',\n language: 'ar-AR',\n dropdownMenu: true,\n filter: true,\n contextMenu: true\n };\n\n // generate random RTL data (e.g., Arabic)\n private generateArabicData(): any[][] {\n const randomName = () =>\n ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () =>\n ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () =>\n new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () =>\n `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example1.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n// @ts-ignore\nimport { arAR, registerLanguageDictionary } from 'handsontable/i18n';\n\nregisterLanguageDictionary(arAR);\n\n@Component({\n selector: 'example1-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n readonly data = this.generateArabicData();\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl',\n language: 'ar-AR',\n dropdownMenu: true,\n filter: true,\n contextMenu: true\n };\n\n // generate random RTL data (e.g., Arabic)\n private generateArabicData(): any[][] {\n const randomName = () =>\n ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () =>\n ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () =>\n new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () =>\n `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example1.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example2.ts.json index 6f0db1aee..4c2807664 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'inherit'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example2.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'inherit'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example2.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example3.ts.json index 6c358fb54..c9aa2c362 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example3.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example3.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example4.ts.json index 141ecf0cd..2b1856e47 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'ltr'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example4.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example4-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'ltr'\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example4.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example5.ts.json index 95659c4bc..8d5729923 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example5.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"Angular"} +{"framework":"angular","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example5-layout-direction',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n\n data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ];\n\n readonly gridSettings: GridSettings = {\n autoWrapRow: true,\n autoWrapCol: true,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ]\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/internationalization/layout-direction/angular/example5.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.js.json index 908c45d81..6e1356ee5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: generateArabicData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n layoutDirection: 'rtl',\n // load an RTL language (e.g., Arabic)\n language: 'ar-AR',\n // enable a few options that exemplify the layout direction\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example1.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: generateArabicData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n layoutDirection: 'rtl',\n // load an RTL language (e.g., Arabic)\n language: 'ar-AR',\n // enable a few options that exemplify the layout direction\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example1.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.ts.json index 0f67fd872..3b4f72621 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: generateArabicData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n layoutDirection: 'rtl',\n // load an RTL language (e.g., Arabic)\n language: 'ar-AR',\n // enable a few options that exemplify the layout direction\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example1.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: generateArabicData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n layoutDirection: 'rtl',\n // load an RTL language (e.g., Arabic)\n language: 'ar-AR',\n // enable a few options that exemplify the layout direction\n dropdownMenu: true,\n filters: true,\n contextMenu: true,\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example1.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.js.json index 01daf4c89..012f589a6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // inherit Handsontable's layout direction\n // from the value of your HTML document's `dir` attribute\n layoutDirection: 'inherit',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example2.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // inherit Handsontable's layout direction\n // from the value of your HTML document's `dir` attribute\n layoutDirection: 'inherit',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example2.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.ts.json index 4f44db4f6..5fae150fc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // inherit Handsontable's layout direction\n // from the value of your HTML document's `dir` attribute\n layoutDirection: 'inherit',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example2.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // inherit Handsontable's layout direction\n // from the value of your HTML document's `dir` attribute\n layoutDirection: 'inherit',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example2.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.js.json index b90a4e9f1..1047cd24d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example3.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example3.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.ts.json index 3885fc1b3..0fc313be9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container: Element = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example3.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container: Element = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example3.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.js.json index 005920f1e..7d438606a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the left to the right\n // regardless of your HTML document's `dir`\n layoutDirection: 'ltr',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example4.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the left to the right\n // regardless of your HTML document's `dir`\n layoutDirection: 'ltr',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example4.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.ts.json index 45d3adf85..4b4ec8c2d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the left to the right\n // regardless of your HTML document's `dir`\n layoutDirection: 'ltr',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example4.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the left to the right\n // regardless of your HTML document's `dir`\n layoutDirection: 'ltr',\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example4.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.js.json index 4aa6e7001..21459f875 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example5.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"JavaScript"} +{"framework":"javascript","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example5.js","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.ts.json index c2b1aa0e8..0be1dcc8e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example5.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"TypeScript"} +{"framework":"typescript","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n ],\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass', 'Known isotopes'],\n rowHeaders: true,\n height: 'auto',\n // render Handsontable from the right to the left\n // regardless of your HTML document's `dir`\n layoutDirection: 'rtl',\n columns: [\n {},\n // align this column's text to the left\n { className: 'htLeft' },\n // align this column's text to the center\n { className: 'htCenter' },\n // align this column's text to the right\n { className: 'htRight' },\n {},\n ],\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/internationalization/layout-direction/javascript/example5.ts","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example1.tsx.json index 6fc551dd7..d8815ce94 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Layout direction · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// register Handsontable's modules\nregisterAllModules();\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst data = generateArabicData();\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example1.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Layout direction · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerLanguageDictionary, arAR } from 'handsontable/i18n';\n\n// register Handsontable's modules\nregisterAllModules();\nregisterLanguageDictionary(arAR);\n\n// generate random RTL data (e.g., Arabic)\nfunction generateArabicData() {\n const randomName = () => ['عمر', 'علي', 'عبد الله', 'معتصم'][Math.floor(Math.random() * 3)];\n\n const randomCountry = () => ['تركيا', 'مصر', 'لبنان', 'العراق'][Math.floor(Math.random() * 3)];\n\n const randomDate = () => new Date(Math.floor(Math.random() * Date.now())).toLocaleDateString();\n\n const randomBool = () => Math.random() > 0.5;\n const randomNumber = (a = 0, b = 1000) => a + Math.floor(Math.random() * b);\n const randomPhrase = () => `${randomCountry()} ${randomName()} ${randomNumber()}`;\n\n const arr = Array.from({ length: 10 }, () => [\n randomBool(),\n randomName(),\n randomCountry(),\n randomPhrase(),\n randomDate(),\n randomPhrase(),\n randomBool(),\n randomNumber(0, 200).toString(),\n randomNumber(0, 10),\n randomNumber(0, 5),\n ]);\n\n return arr;\n}\n\nconst data = generateArabicData();\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example1.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example2.tsx.json index 14a906d89..63e9c3f92 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example2.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example2.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example3.tsx.json index ac8e01115..011bcda39 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example3.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example3.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example4.tsx.json index b76af49a5..6cb65f15b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example4.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example4.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example5.tsx.json index 4926c3a25..a3393ea5b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example5.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"React (TS)"} +{"framework":"react","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008, 7],\n ['Helium', 'He', 2, 4.003, 9],\n ['Lithium', 'Li', 3, 6.94, 9],\n ['Beryllium', 'Be', 4, 9.012, 11],\n ['Boron', 'B', 5, 10.81, 15],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/internationalization/layout-direction/react/example5.tsx","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example1.vue.json index 213e0c8c6..97ae3b6b4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example1.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example1.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/layout-direction","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example2.vue.json index f4f15ea2b..5e033159a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example2.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction automatically · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example2.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example2","exampleTitle":"Set the layout direction automatically","docPermalink":"/layout-direction","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example3.vue.json index 5c9ab0e9c..e16ead098 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example3.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction to RTL · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example3.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example3","exampleTitle":"Set the layout direction to RTL","docPermalink":"/layout-direction","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example4.vue.json index f9780fc3b..50b778c06 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example4.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the layout direction to LTR · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example4.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example4","exampleTitle":"Set the layout direction to LTR","docPermalink":"/layout-direction","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example5.vue.json index f4952a725..bac2dae84 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__internationalization__layout-direction__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example5.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"Vue 3"} +{"framework":"vue","displayName":"Internationalization ▸ Layout direction · Set the horizontal text alignment · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/internationalization/layout-direction/vue/example5.vue","breadcrumb":["Internationalization","Layout direction"],"guide":"guides/internationalization/layout-direction/layout-direction.md","guideTitle":"Layout direction","exampleId":"example5","exampleTitle":"Set the horizontal text alignment","docPermalink":"/layout-direction","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__angular__example1.ts.json index 89a333579..e680b8426 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Custom shortcuts · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example1-custom-shortcuts',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data: Array> = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n afterInit(this: Handsontable) {\n // get the `grid` context from the `ShortcutManager` API\n const gridContext = this.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = this.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n this.alter('insert_row_below', selected.highlight.row);\n },\n });\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/custom-shortcuts/angular/example1.ts","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Custom shortcuts · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example1-custom-shortcuts',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data: Array> = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n afterInit(this: Handsontable) {\n // get the `grid` context from the `ShortcutManager` API\n const gridContext = this.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = this.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n this.alter('insert_row_below', selected.highlight.row);\n },\n });\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/custom-shortcuts/angular/example1.ts","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.js.json index 302b7f31b..b70b1d6d7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Custom shortcuts · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n];\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n// get the `grid` context from the `ShortcutManager` API\nconst gridContext = hot.getShortcutManager().getContext('grid');\nif (gridContext) {\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n if (!selected || selected.highlight.row === null) {\n return;\n }\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/custom-shortcuts/javascript/example1.js","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Custom shortcuts · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// register Handsontable's modules\nregisterAllModules();\nconst data = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n];\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n// get the `grid` context from the `ShortcutManager` API\nconst gridContext = hot.getShortcutManager().getContext('grid');\nif (gridContext) {\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n if (!selected || selected.highlight.row === null) {\n return;\n }\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/custom-shortcuts/javascript/example1.js","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.ts.json index 54089f609..a4f6646ed 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Custom shortcuts · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n];\n\nconst container: Element = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `grid` context from the `ShortcutManager` API\nconst gridContext = hot.getShortcutManager().getContext('grid');\n\nif (gridContext) {\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/custom-shortcuts/javascript/example1.ts","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Custom shortcuts · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n];\n\nconst container: Element = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Product', 'Quantity', 'Category'],\n columns: [{}, {}, { type: 'numeric' }, {}],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// get the `grid` context from the `ShortcutManager` API\nconst gridContext = hot.getShortcutManager().getContext('grid');\n\nif (gridContext) {\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/custom-shortcuts/javascript/example1.ts","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__react__example1.tsx.json index eabd54dad..4d1248ea4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Custom shortcuts · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data: (string | number)[][] = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n ];\n\n const afterInitCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // get the `grid` context from the `ShortcutManager` API\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/custom-shortcuts/react/example1.tsx","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Custom shortcuts · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data: (string | number)[][] = [\n ['SKU-4821', 'Wireless Mouse', 128, 'Electronics'],\n ['SKU-0093', 'Desk Lamp', 42, 'Home Goods'],\n ['SKU-7734', 'USB-C Cable', 310, 'Electronics'],\n ['SKU-2210', 'Notebook Set', 87, 'Office Supplies'],\n ['SKU-5567', 'Water Bottle', 156, 'Outdoor'],\n ];\n\n const afterInitCallback = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // get the `grid` context from the `ShortcutManager` API\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // register a custom keyboard shortcut in the `grid` context:\n // pressing Control/Meta+Enter inserts a new row below the selected cell\n gridContext.addShortcut({\n keys: [['control/meta', 'enter']],\n group: 'insertRowBelow',\n callback: () => {\n const selected = hot.getSelectedRangeLast();\n\n if (!selected || selected.highlight.row === null) {\n return;\n }\n\n hot.alter('insert_row_below', selected.highlight.row);\n },\n });\n };\n\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/custom-shortcuts/react/example1.tsx","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__vue__example1.vue.json index e9e3b9c00..e70481bbe 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__custom-shortcuts__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Custom shortcuts · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/custom-shortcuts/vue/example1.vue","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Custom shortcuts · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/custom-shortcuts/vue/example1.vue","breadcrumb":["Navigation","Custom shortcuts"],"guide":"guides/navigation/custom-shortcuts/custom-shortcuts.md","guideTitle":"Custom shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/custom-shortcuts","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example1.ts.json index 17369e623..3a8a46898 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Focus scopes · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
    \n \n\n \n \n\n \n\n
    \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n {{ isListening }}
    \n getFocusScopeManager().getActiveScopeId()\n {{ focusScope }}
    \n getShortcutManager().getActiveContextName()\n {{ shortcutsContext }}
    \n
    \n
    \n `,\n styles: `\n .placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n }\n\n .placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n .placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n .example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n }\n\n strong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n }\n\n table.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n }\n\n table.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n }\n\n table.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n }\n\n table.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n }\n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private debugInterval?: number;\n private cdr = inject(ChangeDetectorRef);\n\n isListening = 'false';\n focusScope = 'null';\n shortcutsContext = 'null';\n\n readonly hotData = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false }\n ];\n\n readonly hotSettings: GridSettings = {\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit() {\n const hotInstance = this.hotTable.hotInstance;\n\n if (hotInstance) {\n const focusScopeManager = hotInstance.getFocusScopeManager();\n const shortcutManager = hotInstance.getShortcutManager();\n\n this.debugInterval = window.setInterval(() => {\n this.isListening = hotInstance.isListening() ? 'true' : 'false';\n this.focusScope = `${focusScopeManager.getActiveScopeId()}`;\n this.shortcutsContext = `${shortcutManager.getActiveContextName()}`;\n\n this.cdr.detectChanges();\n }, 200);\n }\n }\n\n ngOnDestroy() {\n if (this.debugInterval) {\n clearInterval(this.debugInterval);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/focus-scopes/angular/example1.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Focus scopes · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example1',\n template: `\n
    \n \n\n \n \n\n \n\n
    \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n {{ isListening }}
    \n getFocusScopeManager().getActiveScopeId()\n {{ focusScope }}
    \n getShortcutManager().getActiveContextName()\n {{ shortcutsContext }}
    \n
    \n
    \n `,\n styles: `\n .placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n }\n\n .placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n .placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n .example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n }\n\n strong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n }\n\n table.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n }\n\n table.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n }\n\n table.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n }\n\n table.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n }\n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private debugInterval?: number;\n private cdr = inject(ChangeDetectorRef);\n\n isListening = 'false';\n focusScope = 'null';\n shortcutsContext = 'null';\n\n readonly hotData = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false }\n ];\n\n readonly hotSettings: GridSettings = {\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit() {\n const hotInstance = this.hotTable.hotInstance;\n\n if (hotInstance) {\n const focusScopeManager = hotInstance.getFocusScopeManager();\n const shortcutManager = hotInstance.getShortcutManager();\n\n this.debugInterval = window.setInterval(() => {\n this.isListening = hotInstance.isListening() ? 'true' : 'false';\n this.focusScope = `${focusScopeManager.getActiveScopeId()}`;\n this.shortcutsContext = `${shortcutManager.getActiveContextName()}`;\n\n this.cdr.detectChanges();\n }, 200);\n }\n }\n\n ngOnDestroy() {\n if (this.debugInterval) {\n clearInterval(this.debugInterval);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/focus-scopes/angular/example1.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example2.ts.json index 9c5d79f26..13974bf51 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Focus scopes · Modal scopes · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
    \n \n\n \n \n\n \n\n
    \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n {{ isListening }}
    \n getFocusScopeManager().getActiveScopeId()\n {{ focusScope }}
    \n getShortcutManager().getActiveContextName()\n {{ shortcutsContext }}
    \n
    \n
    \n `,\n styles: `\n .placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n }\n\n .placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n .placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n .example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n }\n\n strong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n }\n\n table.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n }\n\n table.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n }\n\n table.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n }\n\n table.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n }\n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private debugInterval?: number;\n private cdr = inject(ChangeDetectorRef);\n\n isListening = 'false';\n focusScope = 'null';\n shortcutsContext = 'null';\n\n readonly hotData = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false }\n ];\n\n readonly hotSettings: GridSettings = {\n pagination: true,\n dialog: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit() {\n const hotInstance = this.hotTable.hotInstance;\n\n if (hotInstance) {\n const dialogPlugin = hotInstance.getPlugin('dialog');\n\n dialogPlugin.show({\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n });\n\n const focusScopeManager = hotInstance.getFocusScopeManager();\n const shortcutManager = hotInstance.getShortcutManager();\n\n this.debugInterval = window.setInterval(() => {\n this.isListening = hotInstance.isListening() ? 'true' : 'false';\n this.focusScope = `${focusScopeManager.getActiveScopeId()}`;\n this.shortcutsContext = `${shortcutManager.getActiveContextName()}`;\n\n this.cdr.detectChanges();\n }, 200);\n }\n }\n\n ngOnDestroy() {\n if (this.debugInterval) {\n clearInterval(this.debugInterval);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/focus-scopes/angular/example2.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Focus scopes · Modal scopes · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\nimport { HotTableComponent } from '@handsontable/angular-wrapper';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'app-example2',\n template: `\n
    \n \n\n \n \n\n \n\n
    \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n {{ isListening }}
    \n getFocusScopeManager().getActiveScopeId()\n {{ focusScope }}
    \n getShortcutManager().getActiveContextName()\n {{ shortcutsContext }}
    \n
    \n
    \n `,\n styles: `\n .placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n }\n\n .placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n }\n\n .placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n }\n\n .example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n }\n\n strong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n }\n\n table.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n }\n\n table.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n }\n\n table.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n }\n\n table.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n }\n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild('hotTable') hotTable!: HotTableComponent;\n\n private debugInterval?: number;\n private cdr = inject(ChangeDetectorRef);\n\n isListening = 'false';\n focusScope = 'null';\n shortcutsContext = 'null';\n\n readonly hotData = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false }\n ];\n\n readonly hotSettings: GridSettings = {\n pagination: true,\n dialog: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngAfterViewInit() {\n const hotInstance = this.hotTable.hotInstance;\n\n if (hotInstance) {\n const dialogPlugin = hotInstance.getPlugin('dialog');\n\n dialogPlugin.show({\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n });\n\n const focusScopeManager = hotInstance.getFocusScopeManager();\n const shortcutManager = hotInstance.getShortcutManager();\n\n this.debugInterval = window.setInterval(() => {\n this.isListening = hotInstance.isListening() ? 'true' : 'false';\n this.focusScope = `${focusScopeManager.getActiveScopeId()}`;\n this.shortcutsContext = `${shortcutManager.getActiveContextName()}`;\n\n this.cdr.detectChanges();\n }, 200);\n }\n }\n\n ngOnDestroy() {\n if (this.debugInterval) {\n clearInterval(this.debugInterval);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/focus-scopes/angular/example2.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.js.json index 734e5ce51..fbada7270 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Focus scopes · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example1container');\n\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n\n return;\n }\n\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example1.js","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Focus scopes · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example1');\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example1container');\n\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n\n return;\n }\n\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example1.js","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.ts.json index b553bbc88..9fa78a3cf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Focus scopes · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example1container');\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n return;\n }\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example1.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Focus scopes · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example1')!;\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example1container');\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n return;\n }\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example1.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.js.json index fb1153b4d..1cad19e63 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Focus scopes · Modal scopes · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n dialog: {\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n },\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dialogPlugin = hot.getPlugin('dialog');\n\ndialogPlugin.show();\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example2container');\n\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n\n return;\n }\n\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example2.js","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Focus scopes · Modal scopes · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example2');\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n dialog: {\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n },\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dialogPlugin = hot.getPlugin('dialog');\n\ndialogPlugin.show();\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example2container');\n\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n\n return;\n }\n\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example2.js","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.ts.json index bc631f67b..804fb8c3e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Focus scopes · Modal scopes · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example2')!;\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n dialog: {\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n },\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dialogPlugin = hot.getPlugin('dialog');\n\ndialogPlugin.show();\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example2container');\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n return;\n }\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example2.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Focus scopes · Modal scopes · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n
    \n \n \n \n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n false
    \n getFocusScopeManager().getActiveScopeId()\n null
    \n getShortcutManager().getActiveContextName()\n null
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst container = document.querySelector('#example2')!;\nconst hot = new Handsontable(container, {\n data,\n pagination: true,\n dialog: {\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n },\n autoRowSize: true,\n tabNavigation: false,\n columns: [\n {\n title: 'Model',\n type: 'text',\n data: 'model',\n width: 150,\n headerClassName: 'htLeft',\n },\n {\n title: 'Price',\n type: 'numeric',\n data: 'price',\n width: 80,\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Date',\n type: 'intl-date',\n data: 'sellDate',\n width: 131,\n locale: 'en-US',\n dateFormat: { month: 'short', day: 'numeric', year: 'numeric' },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'Time',\n type: 'intl-time',\n data: 'sellTime',\n width: 81,\n locale: 'en-US',\n timeFormat: { hour: '2-digit', minute: '2-digit', hour12: true },\n className: 'htRight',\n headerClassName: 'htRight',\n },\n {\n title: 'In stock',\n type: 'checkbox',\n data: 'inStock',\n className: 'htCenter',\n headerClassName: 'htCenter',\n },\n ],\n width: '100%',\n height: 250,\n stretchH: 'all',\n contextMenu: true,\n rowHeaders: true,\n colHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst dialogPlugin = hot.getPlugin('dialog');\n\ndialogPlugin.show();\n\nconst debugIntervalId = setInterval(function updateDebugInformation() {\n const examplesContainer = document.getElementById('example2container');\n if (!examplesContainer || hot.isDestroyed) {\n clearInterval(debugIntervalId);\n return;\n }\n const isListeningElement = examplesContainer.querySelector('.isListening');\n const focusScopeElement = examplesContainer.querySelector('.focusScope');\n const shortcutsContextElement = examplesContainer.querySelector('.shortcutsContext');\n\n if (isListeningElement && focusScopeElement && shortcutsContextElement) {\n isListeningElement.textContent = `${hot.isListening()}`;\n focusScopeElement.textContent = `${hot.getFocusScopeManager().getActiveScopeId()}`;\n shortcutsContextElement.textContent = `${hot.getShortcutManager().getActiveContextName()}`;\n }\n}, 200);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/javascript/example2.ts","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example1.tsx.json index 0188a561b..fac8dc9c0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Focus scopes · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { useState, useEffect, useRef, useCallback, memo } from 'react';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst Table = memo(({ hotTableRef, data }) => {\n return (\n \n \n \n \n \n \n \n );\n});\n\nconst DebugInfo = memo(({ debugInfo }) => (\n <>\n Debug information:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n \n {String(debugInfo.isListening)}\n
    \n getFocusScopeManager().getActiveScopeId()\n \n {String(debugInfo.focusScope)}\n
    \n getShortcutManager().getActiveContextName()\n \n {String(debugInfo.shortcutsContext)}\n
    \n \n));\n\nconst ExampleComponent = () => {\n const [debugInfo, setDebugInfo] = useState({\n isListening: false,\n focusScope: null,\n shortcutsContext: null,\n });\n\n const hotRef = useRef(null);\n const updateDebugInfo = useCallback(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n setDebugInfo({\n isListening: hotInstance.isListening(),\n focusScope: hotInstance.getFocusScopeManager().getActiveScopeId(),\n shortcutsContext: hotInstance.getShortcutManager().getActiveContextName(),\n });\n }\n }, []);\n\n useEffect(() => {\n const interval = setInterval(updateDebugInfo, 200);\n\n return () => clearInterval(interval);\n }, [updateDebugInfo]);\n\n return (\n
    \n \n\n \n\n \n\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/react/example1.tsx","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Focus scopes · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { useState, useEffect, useRef, useCallback, memo } from 'react';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst Table = memo(({ hotTableRef, data }) => {\n return (\n \n \n \n \n \n \n \n );\n});\n\nconst DebugInfo = memo(({ debugInfo }) => (\n <>\n Debug information:\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n \n {String(debugInfo.isListening)}\n
    \n getFocusScopeManager().getActiveScopeId()\n \n {String(debugInfo.focusScope)}\n
    \n getShortcutManager().getActiveContextName()\n \n {String(debugInfo.shortcutsContext)}\n
    \n \n));\n\nconst ExampleComponent = () => {\n const [debugInfo, setDebugInfo] = useState({\n isListening: false,\n focusScope: null,\n shortcutsContext: null,\n });\n\n const hotRef = useRef(null);\n const updateDebugInfo = useCallback(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n setDebugInfo({\n isListening: hotInstance.isListening(),\n focusScope: hotInstance.getFocusScopeManager().getActiveScopeId(),\n shortcutsContext: hotInstance.getShortcutManager().getActiveContextName(),\n });\n }\n }, []);\n\n useEffect(() => {\n const interval = setInterval(updateDebugInfo, 200);\n\n return () => clearInterval(interval);\n }, [updateDebugInfo]);\n\n return (\n
    \n \n\n \n\n \n\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/react/example1.tsx","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example2.tsx.json index 64f600031..bcecfbabb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Focus scopes · Modal scopes · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { useState, useEffect, useRef, useCallback, memo } from 'react';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst Table = memo(({ hotTableRef, data }) => {\n return (\n \n \n \n \n \n \n \n );\n});\n\nconst DebugInfo = memo(({ debugInfo }) => (\n <>\n Debug information:\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n \n {String(debugInfo.isListening)}\n
    \n getFocusScopeManager().getActiveScopeId()\n \n {String(debugInfo.focusScope)}\n
    \n getShortcutManager().getActiveContextName()\n \n {String(debugInfo.shortcutsContext)}\n
    \n \n));\n\nconst ExampleComponent = () => {\n const [debugInfo, setDebugInfo] = useState({\n isListening: false,\n focusScope: null,\n shortcutsContext: null,\n });\n\n const hotRef = useRef(null);\n const updateDebugInfo = useCallback(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n setDebugInfo({\n isListening: hotInstance.isListening(),\n focusScope: hotInstance.getFocusScopeManager().getActiveScopeId(),\n shortcutsContext: hotInstance.getShortcutManager().getActiveContextName(),\n });\n }\n }, []);\n\n useEffect(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n hotInstance.getPlugin('dialog').show({\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n });\n }\n }, []);\n\n useEffect(() => {\n const interval = setInterval(updateDebugInfo, 200);\n\n return () => clearInterval(interval);\n }, [updateDebugInfo]);\n\n return (\n
    \n \n\n \n\n \n\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/react/example2.tsx","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Focus scopes · Modal scopes · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { useState, useEffect, useRef, useCallback, memo } from 'react';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n { model: 'Trail Helmet', price: 1298.14, sellDate: '2025-08-31', sellTime: '14:12', inStock: true },\n { model: 'Windbreaker Jacket', price: 178.9, sellDate: '2025-05-10', sellTime: '22:26', inStock: false },\n { model: 'Cycling Cap', price: 288.1, sellDate: '2025-09-15', sellTime: '09:37', inStock: true },\n { model: 'HL Mountain Frame', price: 94.49, sellDate: '2025-01-17', sellTime: '14:19', inStock: false },\n { model: 'Racing Socks', price: 430.38, sellDate: '2025-05-10', sellTime: '13:42', inStock: true },\n { model: 'Racing Socks', price: 138.85, sellDate: '2025-09-20', sellTime: '14:48', inStock: true },\n { model: 'HL Mountain Frame', price: 1909.63, sellDate: '2025-09-05', sellTime: '09:35', inStock: false },\n { model: 'Carbon Handlebar', price: 1080.7, sellDate: '2025-10-24', sellTime: '22:58', inStock: false },\n { model: 'Aero Bottle', price: 1571.13, sellDate: '2025-05-24', sellTime: '00:24', inStock: true },\n { model: 'Windbreaker Jacket', price: 919.09, sellDate: '2025-07-16', sellTime: '19:11', inStock: true },\n { model: 'HL Road Tire', price: 886.22, sellDate: '2025-09-09', sellTime: '00:42', inStock: false },\n { model: 'Speed Gloves', price: 635.13, sellDate: '2025-11-17', sellTime: '12:45', inStock: true },\n { model: 'Trail Helmet', price: 1440.64, sellDate: '2025-01-03', sellTime: '20:16', inStock: false },\n { model: 'Aero Bottle', price: 944.63, sellDate: '2025-11-15', sellTime: '16:14', inStock: false },\n { model: 'Windbreaker Jacket', price: 1161.43, sellDate: '2025-06-24', sellTime: '13:19', inStock: false },\n { model: 'LED Bike Light', price: 1012.5, sellDate: '2025-05-01', sellTime: '17:30', inStock: false },\n { model: 'Windbreaker Jacket', price: 635.37, sellDate: '2025-05-14', sellTime: '09:05', inStock: true },\n { model: 'Road Tire Tube', price: 1421.27, sellDate: '2025-01-31', sellTime: '13:33', inStock: true },\n { model: 'Action Camera', price: 1019.05, sellDate: '2025-12-07', sellTime: '01:26', inStock: false },\n { model: 'Carbon Handlebar', price: 603.96, sellDate: '2025-09-13', sellTime: '04:10', inStock: false },\n { model: 'Aero Bottle', price: 1334.03, sellDate: '2025-01-24', sellTime: '03:29', inStock: false },\n { model: 'Road Tire Tube', price: 1841.17, sellDate: '2025-05-22', sellTime: '01:45', inStock: false },\n { model: 'Aero Bottle', price: 1622.05, sellDate: '2025-01-13', sellTime: '08:30', inStock: true },\n { model: 'Comfort Saddle', price: 1456.24, sellDate: '2025-07-20', sellTime: '03:39', inStock: false },\n { model: 'Windbreaker Jacket', price: 1736.96, sellDate: '2025-09-25', sellTime: '00:43', inStock: true },\n { model: 'Fitness Watch', price: 1075.31, sellDate: '2025-11-07', sellTime: '17:47', inStock: true },\n { model: 'Cycling Cap', price: 726.01, sellDate: '2025-10-28', sellTime: '12:44', inStock: true },\n { model: 'Road Tire Tube', price: 601.99, sellDate: '2025-09-22', sellTime: '00:26', inStock: true },\n { model: 'Speed Gloves', price: 1758.26, sellDate: '2025-10-04', sellTime: '04:59', inStock: true },\n { model: 'Speed Gloves', price: 564.35, sellDate: '2025-07-10', sellTime: '18:21', inStock: true },\n { model: 'Hydration Pack', price: 954.84, sellDate: '2025-11-02', sellTime: '00:59', inStock: false },\n { model: 'Cycling Cap', price: 1511.5, sellDate: '2025-02-11', sellTime: '02:38', inStock: false },\n { model: 'HL Road Tire', price: 269.6, sellDate: '2025-06-18', sellTime: '04:58', inStock: false },\n { model: 'Road Tire Tube', price: 435.07, sellDate: '2025-07-22', sellTime: '23:12', inStock: false },\n { model: 'Fitness Watch', price: 1187.8, sellDate: '2025-08-13', sellTime: '10:19', inStock: true },\n { model: 'Racing Socks', price: 770.19, sellDate: '2025-02-02', sellTime: '20:37', inStock: true },\n { model: 'Carbon Handlebar', price: 60.41, sellDate: '2025-12-27', sellTime: '20:30', inStock: true },\n { model: 'Racing Socks', price: 944.21, sellDate: '2025-05-23', sellTime: '18:43', inStock: false },\n { model: 'Racing Socks', price: 621.96, sellDate: '2025-12-12', sellTime: '04:59', inStock: false },\n { model: 'HL Road Tire', price: 774.91, sellDate: '2025-06-02', sellTime: '03:48', inStock: true },\n { model: 'LED Bike Light', price: 1205.29, sellDate: '2025-04-15', sellTime: '22:08', inStock: false },\n { model: 'Racing Socks', price: 388.19, sellDate: '2025-05-24', sellTime: '08:36', inStock: true },\n { model: 'Windbreaker Jacket', price: 267.88, sellDate: '2025-05-25', sellTime: '15:00', inStock: true },\n { model: 'LED Bike Light', price: 283.72, sellDate: '2025-09-26', sellTime: '02:16', inStock: true },\n { model: 'Comfort Saddle', price: 1782.91, sellDate: '2025-03-07', sellTime: '09:43', inStock: false },\n { model: 'Trail Helmet', price: 1943.46, sellDate: '2025-06-05', sellTime: '01:49', inStock: true },\n { model: 'Speed Gloves', price: 1737.8, sellDate: '2025-09-18', sellTime: '14:21', inStock: true },\n { model: 'Road Tire Tube', price: 354.89, sellDate: '2025-08-11', sellTime: '02:03', inStock: true },\n { model: 'Hydration Pack', price: 1490.45, sellDate: '2025-12-04', sellTime: '02:23', inStock: true },\n { model: 'LED Bike Light', price: 844.48, sellDate: '2025-09-22', sellTime: '02:29', inStock: true },\n { model: 'Road Tire Tube', price: 1965.77, sellDate: '2025-02-10', sellTime: '23:52', inStock: false },\n { model: 'Action Camera', price: 522.33, sellDate: '2025-11-11', sellTime: '16:50', inStock: false },\n { model: 'Comfort Saddle', price: 109.4, sellDate: '2025-05-13', sellTime: '11:41', inStock: true },\n { model: 'Hydration Pack', price: 1067.76, sellDate: '2025-08-07', sellTime: '05:04', inStock: false },\n { model: 'Speed Gloves', price: 1738.77, sellDate: '2025-01-28', sellTime: '08:38', inStock: false },\n { model: 'Aero Bottle', price: 1600.35, sellDate: '2025-01-29', sellTime: '00:36', inStock: false },\n { model: 'Speed Gloves', price: 524.91, sellDate: '2025-12-15', sellTime: '12:56', inStock: true },\n { model: 'Windbreaker Jacket', price: 1780.51, sellDate: '2025-09-23', sellTime: '05:02', inStock: false },\n { model: 'Comfort Saddle', price: 1955.0, sellDate: '2025-09-29', sellTime: '13:03', inStock: false },\n { model: 'Speed Gloves', price: 957.4, sellDate: '2025-08-06', sellTime: '03:19', inStock: true },\n { model: 'Fitness Watch', price: 193.72, sellDate: '2025-04-01', sellTime: '19:49', inStock: false },\n { model: 'Speed Gloves', price: 677.94, sellDate: '2025-10-11', sellTime: '22:25', inStock: false },\n { model: 'LED Bike Light', price: 1155.9, sellDate: '2025-03-02', sellTime: '11:36', inStock: false },\n { model: 'LED Bike Light', price: 586.82, sellDate: '2025-11-22', sellTime: '20:29', inStock: false },\n { model: 'Action Camera', price: 406.41, sellDate: '2025-10-25', sellTime: '11:10', inStock: false },\n { model: 'Road Tire Tube', price: 595.55, sellDate: '2025-05-24', sellTime: '01:30', inStock: false },\n { model: 'Racing Socks', price: 1078.63, sellDate: '2025-04-28', sellTime: '02:57', inStock: true },\n { model: 'Cycling Cap', price: 1781.04, sellDate: '2025-10-07', sellTime: '06:58', inStock: false },\n { model: 'Trail Helmet', price: 181.8, sellDate: '2025-10-02', sellTime: '20:04', inStock: false },\n { model: 'HL Mountain Frame', price: 489.39, sellDate: '2025-07-20', sellTime: '10:51', inStock: true },\n { model: 'HL Road Tire', price: 1964.04, sellDate: '2025-07-10', sellTime: '15:01', inStock: true },\n { model: 'Action Camera', price: 1321.19, sellDate: '2025-02-02', sellTime: '13:39', inStock: true },\n { model: 'Trail Helmet', price: 1311.09, sellDate: '2025-12-27', sellTime: '14:45', inStock: false },\n { model: 'Windbreaker Jacket', price: 1573.57, sellDate: '2025-09-20', sellTime: '20:31', inStock: false },\n { model: 'Speed Gloves', price: 338.01, sellDate: '2025-10-22', sellTime: '18:56', inStock: false },\n { model: 'Carbon Handlebar', price: 309.18, sellDate: '2025-11-10', sellTime: '15:20', inStock: true },\n { model: 'LED Bike Light', price: 1289.0, sellDate: '2025-08-22', sellTime: '15:34', inStock: true },\n { model: 'Action Camera', price: 1655.66, sellDate: '2025-06-12', sellTime: '15:38', inStock: false },\n { model: 'Hydration Pack', price: 1126.33, sellDate: '2025-09-15', sellTime: '06:29', inStock: false },\n { model: 'Racing Socks', price: 157.45, sellDate: '2025-01-26', sellTime: '19:25', inStock: true },\n { model: 'Aero Bottle', price: 1707.67, sellDate: '2025-02-02', sellTime: '17:34', inStock: true },\n { model: 'Road Tire Tube', price: 601.95, sellDate: '2025-04-14', sellTime: '08:02', inStock: true },\n { model: 'HL Road Tire', price: 118.42, sellDate: '2025-02-08', sellTime: '06:08', inStock: false },\n { model: 'Racing Socks', price: 1721.99, sellDate: '2025-10-13', sellTime: '09:01', inStock: true },\n { model: 'Action Camera', price: 1620.39, sellDate: '2025-07-18', sellTime: '05:53', inStock: false },\n { model: 'Trail Helmet', price: 1051.16, sellDate: '2025-01-21', sellTime: '09:44', inStock: true },\n { model: 'Fitness Watch', price: 1534.64, sellDate: '2025-02-27', sellTime: '09:19', inStock: true },\n { model: 'Comfort Saddle', price: 984.12, sellDate: '2025-03-16', sellTime: '07:24', inStock: false },\n { model: 'Comfort Saddle', price: 1316.13, sellDate: '2025-02-11', sellTime: '11:01', inStock: true },\n { model: 'Carbon Handlebar', price: 774.69, sellDate: '2025-10-17', sellTime: '11:38', inStock: false },\n { model: 'Road Tire Tube', price: 1887.19, sellDate: '2025-10-19', sellTime: '06:02', inStock: true },\n { model: 'Cycling Cap', price: 519.44, sellDate: '2025-10-21', sellTime: '03:54', inStock: true },\n { model: 'Trail Helmet', price: 1149.2, sellDate: '2025-04-24', sellTime: '04:40', inStock: false },\n { model: 'Carbon Handlebar', price: 915.24, sellDate: '2025-07-10', sellTime: '05:22', inStock: true },\n { model: 'Comfort Saddle', price: 1625.63, sellDate: '2025-03-31', sellTime: '23:55', inStock: true },\n { model: 'Racing Socks', price: 143.76, sellDate: '2025-12-02', sellTime: '07:25', inStock: true },\n { model: 'Cycling Cap', price: 981.24, sellDate: '2025-08-09', sellTime: '19:52', inStock: false },\n { model: 'Comfort Saddle', price: 779.4, sellDate: '2025-06-12', sellTime: '17:08', inStock: true },\n { model: 'Carbon Handlebar', price: 1512.24, sellDate: '2025-07-27', sellTime: '07:02', inStock: true },\n { model: 'Cycling Cap', price: 444.79, sellDate: '2025-09-11', sellTime: '10:05', inStock: false },\n];\n\nconst Table = memo(({ hotTableRef, data }) => {\n return (\n \n \n \n \n \n \n \n );\n});\n\nconst DebugInfo = memo(({ debugInfo }) => (\n <>\n Debug information:\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n isListening()\n \n {String(debugInfo.isListening)}\n
    \n getFocusScopeManager().getActiveScopeId()\n \n {String(debugInfo.focusScope)}\n
    \n getShortcutManager().getActiveContextName()\n \n {String(debugInfo.shortcutsContext)}\n
    \n \n));\n\nconst ExampleComponent = () => {\n const [debugInfo, setDebugInfo] = useState({\n isListening: false,\n focusScope: null,\n shortcutsContext: null,\n });\n\n const hotRef = useRef(null);\n const updateDebugInfo = useCallback(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n setDebugInfo({\n isListening: hotInstance.isListening(),\n focusScope: hotInstance.getFocusScopeManager().getActiveScopeId(),\n shortcutsContext: hotInstance.getShortcutManager().getActiveContextName(),\n });\n }\n }, []);\n\n useEffect(() => {\n const hotInstance = hotRef.current?.hotInstance;\n\n if (hotInstance) {\n hotInstance.getPlugin('dialog').show({\n content: 'This is a simple text message displayed in the dialog.',\n closable: true,\n background: 'semi-transparent',\n });\n }\n }, []);\n\n useEffect(() => {\n const interval = setInterval(updateDebugInfo, 200);\n\n return () => clearInterval(interval);\n }, [updateDebugInfo]);\n\n return (\n
    \n \n\n \n\n \n\n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}\n\nstrong:has(+ table.debug-table) {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--sl-color-white, #333333);\n margin: 0.75rem 0 0;\n padding: 0.5rem 0 0.35rem;\n border-top: 1px solid var(--sl-color-gray-5, #e0e0e0);\n}\n\ntable.debug-table {\n width: 100%;\n border-collapse: collapse;\n box-sizing: border-box;\n font-size: 0.8125rem;\n line-height: 1.6;\n color: var(--sl-color-gray-2, #555555);\n background: transparent;\n}\n\ntable.debug-table td {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-2, #555555);\n}\n\ntable.debug-table td:last-child {\n font-family: var(--sl-font-mono, ui-monospace, monospace);\n}\n\ntable.debug-table td code {\n font-size: var(--sl-text-xs, 0.75rem);\n}"},"docsPath":"guides/navigation/focus-scopes/react/example2.tsx","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example1.vue.json index 5326a1700..833deb6b5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Focus scopes · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/navigation/focus-scopes/vue/example1.vue","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Focus scopes · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/navigation/focus-scopes/vue/example1.vue","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/focus-scopes","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example2.vue.json index 438c68cdb..a42b33e54 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__focus-scopes__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Focus scopes · Modal scopes · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/navigation/focus-scopes/vue/example2.vue","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Focus scopes · Modal scopes · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".placeholder-input {\n max-width: 20rem;\n padding: 0.4rem 0.625rem;\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.25rem;\n color: var(--sl-color-text, #333333);\n background: none;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n outline: none;\n}\n\n.placeholder-input::placeholder {\n color: var(--sl-color-gray-3, #777777);\n}\n\n.placeholder-input:focus {\n border-color: var(--sl-color-accent, #1A42E8);\n}\n\n.example-container {\n gap: 1rem;\n display: flex;\n flex-direction: column;\n}"},"docsPath":"guides/navigation/focus-scopes/vue/example2.vue","breadcrumb":["Navigation","Focus scopes"],"guide":"guides/navigation/focus-scopes/focus-scopes.md","guideTitle":"Focus scopes","exampleId":"example2","exampleTitle":"Modal scopes","docPermalink":"/focus-scopes","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example1.ts.json index 30c1afbc1..c4234349a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Searching values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example1.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Searching values · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example1.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example2.ts.json index 99bbdcbc4..59699920b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom search result class · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n styles: `.ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n }`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example2.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom search result class · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example2-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n styles: `.ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n }`,\n encapsulation: ViewEncapsulation.None,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example2.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example3.ts.json index b7e1da823..ff759bb5e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom query method · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n // add your custom query method\n queryMethod: this.onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n\n // define your custom query method\n onlyExactMatch(\n queryStr: { toString: () => any },\n value: { toString: () => any }\n ): boolean {\n return queryStr.toString() === value.toString();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example3.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom query method · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example3-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n // add your custom query method\n queryMethod: this.onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n searchFieldKeyup(event: KeyboardEvent): void {\n const hot = this.hotTable?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n hot?.render();\n }\n\n // define your custom query method\n onlyExactMatch(\n queryStr: { toString: () => any },\n value: { toString: () => any }\n ): boolean {\n return queryStr.toString() === value.toString();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example3.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example4.ts.json index ab2d9a5f8..c37b0c80e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom callback · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example4-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n {{ resultCount }} results \n
    \n\n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n // add your custom callback function\n callback: (\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: Handsontable.CellValue,\n result: boolean\n ) => this.searchResultCounter(_instance, _row, _col, _value, result),\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n resultCount = 0;\n\n searchFieldKeyup(event: KeyboardEvent): void {\n this.setResultCounter(0);\n\n const search = this.hotTable?.hotInstance?.getPlugin('search');\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n this.hotTable?.hotInstance?.render();\n }\n\n // define your custom callback function\n searchResultCounter(\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: Handsontable.CellValue,\n result: boolean\n ): void {\n _instance.getCellMeta(_row, _col)['isSearchResult'] = result;\n if (result) {\n this.setResultCounter(this.resultCount + 1);\n }\n }\n\n private setResultCounter(count: number): void {\n this.resultCount = count;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example4.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"Angular"} +{"framework":"angular","displayName":"Navigation ▸ Searching values · Custom callback · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n selector: 'example4-searching-values',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n
    \n {{ resultCount }} results \n
    \n\n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Array> = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n search: {\n // add your custom callback function\n callback: (\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: Handsontable.CellValue,\n result: boolean\n ) => this.searchResultCounter(_instance, _row, _col, _value, result),\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n resultCount = 0;\n\n searchFieldKeyup(event: KeyboardEvent): void {\n this.setResultCounter(0);\n\n const search = this.hotTable?.hotInstance?.getPlugin('search');\n const queryResult = search?.query((event.target as any).value);\n\n console.log(queryResult);\n\n this.hotTable?.hotInstance?.render();\n }\n\n // define your custom callback function\n searchResultCounter(\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: Handsontable.CellValue,\n result: boolean\n ): void {\n _instance.getCellMeta(_row, _col)['isSearchResult'] = result;\n if (result) {\n this.setResultCounter(this.resultCount + 1);\n }\n }\n\n private setResultCounter(count: number): void {\n this.resultCount = count;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/navigation/searching-values/angular/example4.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.js.json index ba047a324..abeb31f74 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Searching values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field');\n\n// add a search input listener\nsearchField.addEventListener('keyup', (event) => {\n // get the `Search` plugin's instance\n const search = hot.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example1.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Searching values · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field');\n\n// add a search input listener\nsearchField.addEventListener('keyup', (event) => {\n // get the `Search` plugin's instance\n const search = hot.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example1.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.ts.json index b8fcd366a..46ccc83b9 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Searching values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field')!;\n\n// add a search input listener\nsearchField.addEventListener('keyup', (event) => {\n // get the `Search` plugin's instance\n const search: Search = hot.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example1.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Searching values · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example1')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field')!;\n\n// add a search input listener\nsearchField.addEventListener('keyup', (event) => {\n // get the `Search` plugin's instance\n const search: Search = hot.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example1.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.js.json index fd3ea0a26..fb917d687 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom search result class · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom CSS class\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field2');\n\nsearchField.addEventListener('keyup', (event) => {\n const search = hot.getPlugin('search');\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n hot.render();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/javascript/example2.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom search result class · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example2');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom CSS class\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field2');\n\nsearchField.addEventListener('keyup', (event) => {\n const search = hot.getPlugin('search');\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n hot.render();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/javascript/example2.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.ts.json index c9a49a75d..8c550b5d2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom search result class · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom CSS class\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field2')!;\n\nsearchField.addEventListener('keyup', (event) => {\n const search: Search = hot.getPlugin('search');\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n hot.render();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/javascript/example2.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom search result class · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\nconst container = document.querySelector('#example2')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom CSS class\n searchResultClass: 'my-class',\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field2')!;\n\nsearchField.addEventListener('keyup', (event) => {\n const search: Search = hot.getPlugin('search');\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n hot.render();\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/javascript/example2.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.js.json index c75dbfb4a..fdee55f8d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom query method · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom query method\nfunction onlyExactMatch(queryStr, value) {\n return queryStr.toString() === value.toString();\n}\n\nconst container = document.querySelector('#example3');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom query method\n queryMethod: onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field3');\n\nsearchField.addEventListener('keyup', (event) => {\n const search = hot.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example3.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom query method · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom query method\nfunction onlyExactMatch(queryStr, value) {\n return queryStr.toString() === value.toString();\n}\n\nconst container = document.querySelector('#example3');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom query method\n queryMethod: onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field3');\n\nsearchField.addEventListener('keyup', (event) => {\n const search = hot.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example3.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.ts.json index 06bdcd2f4..252619597 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom query method · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom query method\nfunction onlyExactMatch(queryStr, value) {\n return queryStr.toString() === value.toString();\n}\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom query method\n queryMethod: onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field3')!;\n\nsearchField.addEventListener('keyup', (event) => {\n const search: Search = hot.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example3.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom query method · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom query method\nfunction onlyExactMatch(queryStr, value) {\n return queryStr.toString() === value.toString();\n}\n\nconst container = document.querySelector('#example3')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom query method\n queryMethod: onlyExactMatch,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field3')!;\n\nsearchField.addEventListener('keyup', (event) => {\n const search: Search = hot.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example3.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.js.json index 024328e4c..0075a64ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom callback · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n 0 results\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet searchResultCount = 0;\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom callback function\nfunction searchResultCounter(instance, row, column, value, result) {\n const DEFAULT_CALLBACK = function (instance, row, col, _data, testResult) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, [instance, row, column, value, result]);\n\n if (result) {\n searchResultCount++;\n }\n}\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom callback function\n callback: searchResultCounter,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field4');\nconst output = document.querySelector('#output');\n\nsearchField.addEventListener('keyup', (event) => {\n searchResultCount = 0;\n\n const search = hot.getPlugin('search');\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n output.innerText = `${searchResultCount} results`;\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example4.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"JavaScript"} +{"framework":"javascript","displayName":"Navigation ▸ Searching values · Custom callback · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n 0 results\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet searchResultCount = 0;\n\nconst data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom callback function\nfunction searchResultCounter(instance, row, column, value, result) {\n const DEFAULT_CALLBACK = function (instance, row, col, _data, testResult) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, [instance, row, column, value, result]);\n\n if (result) {\n searchResultCount++;\n }\n}\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom callback function\n callback: searchResultCounter,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field4');\nconst output = document.querySelector('#output');\n\nsearchField.addEventListener('keyup', (event) => {\n searchResultCount = 0;\n\n const search = hot.getPlugin('search');\n const queryResult = search.query(event.target.value);\n\n console.log(queryResult);\n output.innerText = `${searchResultCount} results`;\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/navigation/searching-values/javascript/example4.js","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.ts.json index 20dc4455e..62b092a93 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom callback · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n 0 results\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet searchResultCount = 0;\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom callback function\nfunction searchResultCounter(\n instance: Handsontable.Core,\n row: number,\n column: number,\n value: Handsontable.CellValue,\n result: boolean\n): void {\n const DEFAULT_CALLBACK = function (instance, row, col, _data, testResult) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, [instance, row, column, value, result]);\n\n if (result) {\n searchResultCount++;\n }\n}\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom callback function\n callback: searchResultCounter,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field4')!;\nconst output = document.querySelector('#output')!;\n\nsearchField.addEventListener('keyup', (event) => {\n searchResultCount = 0;\n\n const search: Search = hot.getPlugin('search');\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n (output as HTMLElement).innerText = `${searchResultCount} results`;\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example4.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"TypeScript"} +{"framework":"typescript","displayName":"Navigation ▸ Searching values · Custom callback · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n 0 results\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nlet searchResultCount = 0;\n\nconst data: (string | number)[][] = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n];\n\n// define your custom callback function\nfunction searchResultCounter(\n instance: Handsontable.Core,\n row: number,\n column: number,\n value: Handsontable.CellValue,\n result: boolean\n): void {\n const DEFAULT_CALLBACK = function (instance, row, col, _data, testResult) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, [instance, row, column, value, result]);\n\n if (result) {\n searchResultCount++;\n }\n}\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Name', 'Symbol', 'Atomic number', 'Atomic mass'],\n // enable the `Search` plugin\n search: {\n // add your custom callback function\n callback: searchResultCounter,\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchField = document.querySelector('#search_field4')!;\nconst output = document.querySelector('#output')!;\n\nsearchField.addEventListener('keyup', (event) => {\n searchResultCount = 0;\n\n const search: Search = hot.getPlugin('search');\n const queryResult = search.query((event.target as HTMLInputElement).value);\n\n console.log(queryResult);\n (output as HTMLElement).innerText = `${searchResultCount} results`;\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/navigation/searching-values/javascript/example4.ts","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example1.tsx.json index faa26fbe0..5da934c76 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Searching values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot?.render();\n },\n [hotRef.current]\n );\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(event)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example1.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Searching values · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n // get the `Search` plugin's instance\n const search = hot?.getPlugin('search');\n // use the `Search` plugin's `query()` method\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot?.render();\n },\n [hotRef.current]\n );\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(event)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example1.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example2.tsx.json index f0310d903..b6012672d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Searching values · Custom search result class · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n const search = hot?.getPlugin('search');\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n hot?.render();\n },\n [hotRef.current]\n );\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(...args)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/react/example2.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Searching values · Custom search result class · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n const search = hot?.getPlugin('search');\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n hot?.render();\n },\n [hotRef.current]\n );\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(...args)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/react/example2.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example3.tsx.json index 17dd77a61..c87195943 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Searching values · Custom query method · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n const search = hot?.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot?.render();\n },\n [hotRef.current]\n );\n\n // define your custom query method\n function onlyExactMatch(queryStr: { toString: () => any }, value: { toString: () => any }) {\n return queryStr.toString() === value.toString();\n }\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(...args)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example3.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Searching values · Custom query method · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n const searchFieldKeyupCallback = useCallback(\n (event: React.KeyboardEvent) => {\n const hot = hotRef.current?.hotInstance;\n const search = hot?.getPlugin('search');\n // use the `Search`'s `query()` method\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot?.render();\n },\n [hotRef.current]\n );\n\n // define your custom query method\n function onlyExactMatch(queryStr: { toString: () => any }, value: { toString: () => any }) {\n return queryStr.toString() === value.toString();\n }\n\n return (\n <>\n
    \n
    \n searchFieldKeyupCallback(...args)}\n />\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example3.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example4.tsx.json index aa0cd2f5c..6910821b1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Navigation ▸ Searching values · Custom callback · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hot4Ref = useRef(null);\n const [resultCount, setResultCounter] = useState(0);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n // define your custom callback function\n function searchResultCounter(\n this: Handsontable,\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: any,\n result: any\n ) {\n const DEFAULT_CALLBACK = function (instance: Handsontable, row: number, col: number, _data: any, testResult: any) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, arguments as any);\n\n if (result) {\n setResultCounter((count) => count + 1);\n }\n }\n\n const handleKeyUp = (event: React.KeyboardEvent) => {\n setResultCounter(0);\n\n const search = hot4Ref.current?.hotInstance?.getPlugin('search');\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot4Ref.current?.hotInstance?.render();\n };\n\n return (\n <>\n
    \n
    \n \n
    \n \n {resultCount} results\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example4.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"React (TS)"} +{"framework":"react","displayName":"Navigation ▸ Searching values · Custom callback · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst ExampleComponent = () => {\n const hot4Ref = useRef(null);\n const [resultCount, setResultCounter] = useState(0);\n\n const data = [\n ['Hydrogen', 'H', 1, 1.008],\n ['Helium', 'He', 2, 4.003],\n ['Lithium', 'Li', 3, 6.94],\n ['Beryllium', 'Be', 4, 9.012],\n ['Boron', 'B', 5, 10.81],\n ];\n\n // define your custom callback function\n function searchResultCounter(\n this: Handsontable,\n _instance: Handsontable,\n _row: number,\n _col: number,\n _value: any,\n result: any\n ) {\n const DEFAULT_CALLBACK = function (instance: Handsontable, row: number, col: number, _data: any, testResult: any) {\n instance.getCellMeta(row, col).isSearchResult = testResult;\n };\n\n DEFAULT_CALLBACK.apply(this, arguments as any);\n\n if (result) {\n setResultCounter((count) => count + 1);\n }\n }\n\n const handleKeyUp = (event: React.KeyboardEvent) => {\n setResultCounter(0);\n\n const search = hot4Ref.current?.hotInstance?.getPlugin('search');\n const queryResult = search?.query(event.currentTarget.value);\n\n console.log(queryResult);\n\n hot4Ref.current?.hotInstance?.render();\n };\n\n return (\n <>\n
    \n
    \n \n
    \n \n {resultCount} results\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/navigation/searching-values/react/example4.tsx","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example1.vue.json index e4bda3522..21ecf4063 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Searching values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example1.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Searching values · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example1.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/searching-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example2.vue.json index efc5cc923..6b8b3804d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom search result class · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/vue/example2.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom search result class · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n","/src/styles.css":".ht-theme-main .handsontable .my-class {\n background: pink;\n color: red;\n}"},"docsPath":"guides/navigation/searching-values/vue/example2.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example2","exampleTitle":"Custom search result class","docPermalink":"/searching-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example3.vue.json index d63a37df1..d2028929c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom query method · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example3.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom query method · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example3.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example3","exampleTitle":"Custom query method","docPermalink":"/searching-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example4.vue.json index 48e084b77..2920c28a6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__navigation__searching-values__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom callback · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example4.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"Vue 3"} +{"framework":"vue","displayName":"Navigation ▸ Searching values · Custom callback · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/navigation/searching-values/vue/example4.vue","breadcrumb":["Navigation","Searching values"],"guide":"guides/navigation/searching-values/searching-values.md","guideTitle":"Searching values","exampleId":"example4","exampleTitle":"Custom callback","docPermalink":"/searching-values","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__angular__example1.ts.json index f206984f8..4dd73aa81 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Optimization ▸ Batch operations · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-batch-operation',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n Run without batch method\n \n \n Run with batch method\n \n
    \n \n {{ output || 'Here you will see the log' }}\n \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n dataInit = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n ];\n data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n width: 'auto',\n colHeaders: [\n 'ID',\n 'Customer name',\n 'Product name',\n 'Size',\n 'qty',\n 'Return',\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output!: string;\n counter = 0;\n\n buttonWithoutClick(): void {\n const t1 = performance.now();\n\n this.alterTable();\n\n const t2 = performance.now();\n\n this.logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n }\n\n buttonWithClick(): void {\n const hot = this.hotTable?.hotInstance;\n const t1 = performance.now();\n\n hot?.batch(() => this.alterTable());\n\n const t2 = performance.now();\n\n this.logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n }\n\n private alterTable(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.alter('insert_row_above', 10, 10);\n hot?.alter('insert_col_start', 6, 1);\n hot?.populateFromArray(10, 0, this.data2);\n hot?.populateFromArray(11, 0, this.data3);\n hot?.setCellMeta(2, 2, 'className', 'green-bg');\n hot?.setCellMeta(4, 2, 'className', 'green-bg');\n hot?.setCellMeta(5, 2, 'className', 'green-bg');\n hot?.setCellMeta(6, 2, 'className', 'green-bg');\n hot?.setCellMeta(8, 2, 'className', 'green-bg');\n hot?.setCellMeta(9, 2, 'className', 'green-bg');\n hot?.setCellMeta(10, 2, 'className', 'green-bg');\n hot?.alter('remove_col', 6, 1);\n hot?.alter('remove_row', 10, 10);\n hot?.setCellMeta(0, 5, 'className', 'red-bg');\n hot?.setCellMeta(10, 5, 'className', 'red-bg');\n hot?.render(); // Render is needed here to populate the new \"className\"s\n }\n\n private logOutput(output: string): void {\n this.output = `[${this.counter}] ${output}\\n${this.output ?? ''}`;\n this.counter = this.counter + 1;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/optimization/batch-operations/angular/example1.ts","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"Angular"} +{"framework":"angular","displayName":"Optimization ▸ Batch operations · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'example1-batch-operation',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n
    \n \n Run without batch method\n \n \n Run with batch method\n \n
    \n \n {{ output || 'Here you will see the log' }}\n \n
    \n
    \n \n
    `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n dataInit = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n ];\n data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n ];\n\n readonly gridSettings: GridSettings = {\n height: 'auto',\n width: 'auto',\n colHeaders: [\n 'ID',\n 'Customer name',\n 'Product name',\n 'Size',\n 'qty',\n 'Return',\n ],\n autoWrapRow: true,\n autoWrapCol: true\n };\n\n output!: string;\n counter = 0;\n\n buttonWithoutClick(): void {\n const t1 = performance.now();\n\n this.alterTable();\n\n const t2 = performance.now();\n\n this.logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n }\n\n buttonWithClick(): void {\n const hot = this.hotTable?.hotInstance;\n const t1 = performance.now();\n\n hot?.batch(() => this.alterTable());\n\n const t2 = performance.now();\n\n this.logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n }\n\n private alterTable(): void {\n const hot = this.hotTable?.hotInstance;\n\n hot?.alter('insert_row_above', 10, 10);\n hot?.alter('insert_col_start', 6, 1);\n hot?.populateFromArray(10, 0, this.data2);\n hot?.populateFromArray(11, 0, this.data3);\n hot?.setCellMeta(2, 2, 'className', 'green-bg');\n hot?.setCellMeta(4, 2, 'className', 'green-bg');\n hot?.setCellMeta(5, 2, 'className', 'green-bg');\n hot?.setCellMeta(6, 2, 'className', 'green-bg');\n hot?.setCellMeta(8, 2, 'className', 'green-bg');\n hot?.setCellMeta(9, 2, 'className', 'green-bg');\n hot?.setCellMeta(10, 2, 'className', 'green-bg');\n hot?.alter('remove_col', 6, 1);\n hot?.alter('remove_row', 10, 10);\n hot?.setCellMeta(0, 5, 'className', 'red-bg');\n hot?.setCellMeta(10, 5, 'className', 'red-bg');\n hot?.render(); // Render is needed here to populate the new \"className\"s\n }\n\n private logOutput(output: string): void {\n this.output = `[${this.counter}] ${output}\\n${this.output ?? ''}`;\n this.counter = this.counter + 1;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/optimization/batch-operations/angular/example1.ts","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.js.json index 4abae547f..471b88ae8 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Optimization ▸ Batch operations · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Here you will see the log\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst buttonWithout = document.querySelector('#buttonWithout');\nconst buttonWith = document.querySelector('#buttonWith');\nconst output = document.querySelector('#output');\nconst data1 = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\nconst data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n];\n\nconst hot = new Handsontable(container, {\n data: data1,\n width: 'auto',\n height: 'auto',\n colHeaders: ['ID', 'Customer name', 'Product name', 'Size', 'qty', 'Return'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst alterTable = () => {\n hot.alter('insert_row_above', 10, 10);\n hot.alter('insert_col_start', 6, 1);\n hot.populateFromArray(10, 0, data2);\n hot.populateFromArray(11, 0, data3);\n hot.setCellMeta(2, 2, 'className', 'green-bg');\n hot.setCellMeta(4, 2, 'className', 'green-bg');\n hot.setCellMeta(5, 2, 'className', 'green-bg');\n hot.setCellMeta(6, 2, 'className', 'green-bg');\n hot.setCellMeta(8, 2, 'className', 'green-bg');\n hot.setCellMeta(9, 2, 'className', 'green-bg');\n hot.setCellMeta(10, 2, 'className', 'green-bg');\n hot.alter('remove_col', 6, 1);\n hot.alter('remove_row', 10, 10);\n hot.setCellMeta(0, 5, 'className', 'red-bg');\n hot.setCellMeta(10, 5, 'className', 'red-bg');\n hot.render(); // Render is needed here to populate the new \"className\"s\n};\n\nlet loggedText = '';\nlet counter = 0;\nconst logOutput = (msg) => {\n counter++;\n loggedText = `[${counter}] ${msg}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nbuttonWithout.addEventListener('click', () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n});\nbuttonWith.addEventListener('click', () => {\n const t1 = performance.now();\n\n hot.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/optimization/batch-operations/javascript/example1.js","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"JavaScript"} +{"framework":"javascript","displayName":"Optimization ▸ Batch operations · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Here you will see the log\n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1');\nconst buttonWithout = document.querySelector('#buttonWithout');\nconst buttonWith = document.querySelector('#buttonWith');\nconst output = document.querySelector('#output');\nconst data1 = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\nconst data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n];\n\nconst hot = new Handsontable(container, {\n data: data1,\n width: 'auto',\n height: 'auto',\n colHeaders: ['ID', 'Customer name', 'Product name', 'Size', 'qty', 'Return'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst alterTable = () => {\n hot.alter('insert_row_above', 10, 10);\n hot.alter('insert_col_start', 6, 1);\n hot.populateFromArray(10, 0, data2);\n hot.populateFromArray(11, 0, data3);\n hot.setCellMeta(2, 2, 'className', 'green-bg');\n hot.setCellMeta(4, 2, 'className', 'green-bg');\n hot.setCellMeta(5, 2, 'className', 'green-bg');\n hot.setCellMeta(6, 2, 'className', 'green-bg');\n hot.setCellMeta(8, 2, 'className', 'green-bg');\n hot.setCellMeta(9, 2, 'className', 'green-bg');\n hot.setCellMeta(10, 2, 'className', 'green-bg');\n hot.alter('remove_col', 6, 1);\n hot.alter('remove_row', 10, 10);\n hot.setCellMeta(0, 5, 'className', 'red-bg');\n hot.setCellMeta(10, 5, 'className', 'red-bg');\n hot.render(); // Render is needed here to populate the new \"className\"s\n};\n\nlet loggedText = '';\nlet counter = 0;\nconst logOutput = (msg) => {\n counter++;\n loggedText = `[${counter}] ${msg}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nbuttonWithout.addEventListener('click', () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n});\nbuttonWith.addEventListener('click', () => {\n const t1 = performance.now();\n\n hot.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/optimization/batch-operations/javascript/example1.js","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.ts.json index 3a20618d4..eee10fb68 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Optimization ▸ Batch operations · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Here you will see the log\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst buttonWithout = document.querySelector('#buttonWithout')!;\nconst buttonWith = document.querySelector('#buttonWith')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nconst data1: (string | number)[][] = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst data2: (string | number)[][] = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n\nconst data3: (string | number)[][] = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n];\n\nconst hot = new Handsontable(container, {\n data: data1,\n width: 'auto',\n height: 'auto',\n colHeaders: ['ID', 'Customer name', 'Product name', 'Size', 'qty', 'Return'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst alterTable = () => {\n hot.alter('insert_row_above', 10, 10);\n hot.alter('insert_col_start', 6, 1);\n hot.populateFromArray(10, 0, data2);\n hot.populateFromArray(11, 0, data3);\n hot.setCellMeta(2, 2, 'className', 'green-bg');\n hot.setCellMeta(4, 2, 'className', 'green-bg');\n hot.setCellMeta(5, 2, 'className', 'green-bg');\n hot.setCellMeta(6, 2, 'className', 'green-bg');\n hot.setCellMeta(8, 2, 'className', 'green-bg');\n hot.setCellMeta(9, 2, 'className', 'green-bg');\n hot.setCellMeta(10, 2, 'className', 'green-bg');\n hot.alter('remove_col', 6, 1);\n hot.alter('remove_row', 10, 10);\n hot.setCellMeta(0, 5, 'className', 'red-bg');\n hot.setCellMeta(10, 5, 'className', 'red-bg');\n hot.render(); // Render is needed here to populate the new \"className\"s\n};\n\nlet loggedText = '';\nlet counter = 0;\n\nconst logOutput = (msg: string) => {\n counter++;\n loggedText = `[${counter}] ${msg}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nbuttonWithout.addEventListener('click', () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n});\n\nbuttonWith.addEventListener('click', () => {\n const t1 = performance.now();\n\n hot.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/optimization/batch-operations/javascript/example1.ts","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"TypeScript"} +{"framework":"typescript","displayName":"Optimization ▸ Batch operations · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n Here you will see the log\n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\nconst buttonWithout = document.querySelector('#buttonWithout')!;\nconst buttonWith = document.querySelector('#buttonWith')!;\nconst output = document.querySelector('#output') as HTMLElement;\n\nconst data1: (string | number)[][] = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst data2: (string | number)[][] = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n\nconst data3: (string | number)[][] = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n];\n\nconst hot = new Handsontable(container, {\n data: data1,\n width: 'auto',\n height: 'auto',\n colHeaders: ['ID', 'Customer name', 'Product name', 'Size', 'qty', 'Return'],\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst alterTable = () => {\n hot.alter('insert_row_above', 10, 10);\n hot.alter('insert_col_start', 6, 1);\n hot.populateFromArray(10, 0, data2);\n hot.populateFromArray(11, 0, data3);\n hot.setCellMeta(2, 2, 'className', 'green-bg');\n hot.setCellMeta(4, 2, 'className', 'green-bg');\n hot.setCellMeta(5, 2, 'className', 'green-bg');\n hot.setCellMeta(6, 2, 'className', 'green-bg');\n hot.setCellMeta(8, 2, 'className', 'green-bg');\n hot.setCellMeta(9, 2, 'className', 'green-bg');\n hot.setCellMeta(10, 2, 'className', 'green-bg');\n hot.alter('remove_col', 6, 1);\n hot.alter('remove_row', 10, 10);\n hot.setCellMeta(0, 5, 'className', 'red-bg');\n hot.setCellMeta(10, 5, 'className', 'red-bg');\n hot.render(); // Render is needed here to populate the new \"className\"s\n};\n\nlet loggedText = '';\nlet counter = 0;\n\nconst logOutput = (msg: string) => {\n counter++;\n loggedText = `[${counter}] ${msg}\\n${loggedText}`;\n output.innerText = loggedText;\n};\n\nbuttonWithout.addEventListener('click', () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n});\n\nbuttonWith.addEventListener('click', () => {\n const t1 = performance.now();\n\n hot.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/optimization/batch-operations/javascript/example1.ts","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__react__example1.tsx.json index 86a2db94f..55a73eee0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Optimization ▸ Batch operations · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [counter, setCounter] = useState(0);\n const [output, setOutput] = useState('');\n\n const data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n const data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n ];\n\n const logOutput = (msg: string) => {\n setCounter(counter + 1);\n setOutput(`[${counter}] ${msg}\\n${output}`);\n };\n\n const alterTable = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.alter('insert_row_above', 10, 10);\n hot?.alter('insert_col_start', 6, 1);\n hot?.populateFromArray(10, 0, data2);\n hot?.populateFromArray(11, 0, data3);\n hot?.setCellMeta(2, 2, 'className', 'green-bg');\n hot?.setCellMeta(4, 2, 'className', 'green-bg');\n hot?.setCellMeta(5, 2, 'className', 'green-bg');\n hot?.setCellMeta(6, 2, 'className', 'green-bg');\n hot?.setCellMeta(8, 2, 'className', 'green-bg');\n hot?.setCellMeta(9, 2, 'className', 'green-bg');\n hot?.setCellMeta(10, 2, 'className', 'green-bg');\n hot?.alter('remove_col', 6, 1);\n hot?.alter('remove_row', 10, 10);\n hot?.setCellMeta(0, 5, 'className', 'red-bg');\n hot?.setCellMeta(10, 5, 'className', 'red-bg');\n hot?.render(); // Render is needed here to populate the new \"className\"s\n };\n\n const buttonWithoutClickCallback = () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n };\n\n const buttonWithClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const t1 = performance.now();\n\n hot?.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n };\n\n return (\n <>\n
    \n
    \n \n \n
    \n \n {output || 'Here you will see the log'}\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/optimization/batch-operations/react/example1.tsx","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"React (TS)"} +{"framework":"react","displayName":"Optimization ▸ Batch operations · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [1, 'Gary Nash', 'Speckled trousers', 'S', 1, 'yes'],\n [2, 'Gloria Brown', '100% Stainless sweater', 'M', 2, 'no'],\n [3, 'Ronald Carver', 'Sunny T-shirt', 'S', 1, 'no'],\n [4, 'Samuel Watkins', 'Floppy socks', 'S', 3, 'no'],\n [5, 'Stephanie Huddart', 'Bushy-bush cap', 'XXL', 1, 'no'],\n [6, 'Madeline McGillivray', 'Long skirt', 'L', 1, 'no'],\n [7, 'Jai Moor', 'Happy dress', 'XS', 1, 'no'],\n [8, 'Ben Lower', 'Speckled trousers', 'M', 1, 'no'],\n [9, 'Ali Tunbridge', 'Speckled trousers', 'M', 2, 'no'],\n [10, 'Archie Galvin', 'Regular shades', 'uni', 10, 'no'],\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [counter, setCounter] = useState(0);\n const [output, setOutput] = useState('');\n\n const data2 = [[11, 'Gavin Elle', 'Floppy socks', 'XS', 3, 'yes']];\n const data3 = [\n [12, 'Gary Erre', 'Happy dress', 'M', 1, 'no'],\n [13, 'Anna Moon', 'Unicorn shades', 'uni', 200, 'no'],\n [14, 'Elise Eli', 'Regular shades', 'uni', 1, 'no'],\n ];\n\n const logOutput = (msg: string) => {\n setCounter(counter + 1);\n setOutput(`[${counter}] ${msg}\\n${output}`);\n };\n\n const alterTable = () => {\n const hot = hotRef.current?.hotInstance;\n\n hot?.alter('insert_row_above', 10, 10);\n hot?.alter('insert_col_start', 6, 1);\n hot?.populateFromArray(10, 0, data2);\n hot?.populateFromArray(11, 0, data3);\n hot?.setCellMeta(2, 2, 'className', 'green-bg');\n hot?.setCellMeta(4, 2, 'className', 'green-bg');\n hot?.setCellMeta(5, 2, 'className', 'green-bg');\n hot?.setCellMeta(6, 2, 'className', 'green-bg');\n hot?.setCellMeta(8, 2, 'className', 'green-bg');\n hot?.setCellMeta(9, 2, 'className', 'green-bg');\n hot?.setCellMeta(10, 2, 'className', 'green-bg');\n hot?.alter('remove_col', 6, 1);\n hot?.alter('remove_row', 10, 10);\n hot?.setCellMeta(0, 5, 'className', 'red-bg');\n hot?.setCellMeta(10, 5, 'className', 'red-bg');\n hot?.render(); // Render is needed here to populate the new \"className\"s\n };\n\n const buttonWithoutClickCallback = () => {\n const t1 = performance.now();\n\n alterTable();\n\n const t2 = performance.now();\n\n logOutput(`Time without batch ${(t2 - t1).toFixed(2)}ms`);\n };\n\n const buttonWithClickCallback = () => {\n const hot = hotRef.current?.hotInstance;\n const t1 = performance.now();\n\n hot?.batch(alterTable);\n\n const t2 = performance.now();\n\n logOutput(`Time with batch ${(t2 - t1).toFixed(2)}ms`);\n };\n\n return (\n <>\n
    \n
    \n \n \n
    \n \n {output || 'Here you will see the log'}\n \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/optimization/batch-operations/react/example1.tsx","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__vue__example1.vue.json index 34789f500..cce0e635b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__optimization__batch-operations__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Optimization ▸ Batch operations · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/optimization/batch-operations/vue/example1.vue","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"Vue 3"} +{"framework":"vue","displayName":"Optimization ▸ Batch operations · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/optimization/batch-operations/vue/example1.vue","breadcrumb":["Optimization","Batch operations"],"guide":"guides/optimization/batch-operations/batch-operations.md","guideTitle":"Batch operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/batch-operations","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__angular__example1.ts.json index 27e68765d..b73e9e6e6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row freezing · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-freezing/angular/example1.ts","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row freezing · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\n readonly hotSettings: GridSettings = {\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-freezing/angular/example1.ts","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.js.json index c4513ede9..ba3836955 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row freezing · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-freezing/javascript/example1.js","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row freezing · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-freezing/javascript/example1.js","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.ts.json index 6c6a94129..da3bf61d6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row freezing · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-freezing/javascript/example1.ts","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row freezing · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data: string[][] = new Array(100) // number of rows\n .fill(null)\n .map((_, row) =>\n new Array(50) // number of columns\n .fill(null)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n colWidths: 100,\n width: '100%',\n height: 320,\n rowHeaders: true,\n colHeaders: true,\n fixedRowsTop: 2,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-freezing/javascript/example1.ts","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__react__example1.tsx.json index ede56f114..6a07c4863 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row freezing · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(0)\n .map((_item, row) =>\n new Array(50) // number of columns\n .fill(0)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-freezing/react/example1.tsx","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row freezing · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// generate an array of arrays with dummy data\nconst data = new Array(100) // number of rows\n .fill(0)\n .map((_item, row) =>\n new Array(50) // number of columns\n .fill(0)\n .map((_, column) => `${row}, ${column}`)\n );\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-freezing/react/example1.tsx","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__vue__example1.vue.json index 2ddb012a1..576063b85 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-freezing__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row freezing · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-freezing/vue/example1.vue","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row freezing · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-freezing/vue/example1.vue","breadcrumb":["Rows","Row freezing"],"guide":"guides/rows/row-freezing/row-freezing.md","guideTitle":"Row freezing","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-freezing","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example1.ts.json index 0ed529fa6..d652b51bc 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row headers · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n hotData: number[][] = [];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngOnInit() {\n this.hotData = this.generateData();\n }\n\n // Generate an array of arrays with a dummy data\n private generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n const array2d = [...new Array(rows)].map((_) =>\n [...new Array(columns)].map((_) => counter++)\n );\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example1.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row headers · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnInit } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent implements OnInit {\n\n hotData: number[][] = [];\n\n readonly hotSettings: GridSettings = {\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n ngOnInit() {\n this.hotData = this.generateData();\n }\n\n // Generate an array of arrays with a dummy data\n private generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n const array2d = [...new Array(rows)].map((_) =>\n [...new Array(columns)].map((_) => counter++)\n );\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example1.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example2.ts.json index cbd0320db..dd467316f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row headers · Row headers as an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example2.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row headers · Row headers as an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example2.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example3.ts.json index 2514837df..efd0fd8a5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row headers · Row headers as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index: number) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example3.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row headers · Row headers as a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index: number) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example3.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example4.ts.json index 371c99d0a..dc4162753 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row headers · Size the header to its content · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example4.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row headers · Size the header to its content · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example4.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example5.ts.json index 413bfd135..a33b34271 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row headers · Add more row header columns · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ];\n\n readonly groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\n\n readonly lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers: Array<(renderableRowIndex: number, TH: HTMLElement) => void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = this.groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = this.lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example5.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row headers · Add more row header columns · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ];\n\n readonly groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\n\n readonly lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers: Array<(renderableRowIndex: number, TH: HTMLElement) => void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = this.groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = this.lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-header/angular/example5.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.js.json index 59118aeab..2ede1704f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row headers · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: generateData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example1.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row headers · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data: generateData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example1.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.ts.json index e40ad4acf..2b8db5f47 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row headers · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: generateData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example1.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row headers · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: generateData(),\n colHeaders: true,\n rowHeaders: true,\n height: 'auto',\n contextMenu: true,\n manualRowMove: true,\n bindRowsWithHeaders: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example1.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.js.json index 9242b3162..f29450e4b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row headers · Row headers as an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example2.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row headers · Row headers as an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example2.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.ts.json index 05c28b994..a9e14069c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row headers · Row headers as an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example2.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row headers · Row headers as an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders: ['January', 'February', 'March', 'April', 'May', 'June'],\n rowHeaderWidth: 80,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example2.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.js.json index ae749200d..4867fc734 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row headers · Row headers as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example3.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row headers · Row headers as a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example3.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.ts.json index 7760a8469..d61e5a6e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row headers · Row headers as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example3.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row headers · Row headers as a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n ],\n colHeaders: ['Revenue', 'Expenses', 'Profit'],\n rowHeaders(index) {\n return `Row ${index + 1}`;\n },\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example3.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.js.json index 23ea98bfa..42d19071e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row headers · Size the header to its content · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example4.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row headers · Size the header to its content · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example4.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.ts.json index 5eb9ff91d..a3ccb98ae 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row headers · Size the header to its content · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example4.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row headers · Size the header to its content · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n ],\n // Size the row header column to its longest label.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example4.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.js.json index ef079fca5..b5f6ba107 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row headers · Add more row header columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example5.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row headers · Add more row header columns · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-header/javascript/example5.js","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.ts.json index ce9939ffb..4b605cd60 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row headers · Add more row header columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\n\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers: Array<(renderableRowIndex: number, TH: HTMLElement) => void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example5.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row headers · Add more row header columns · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\n\nnew Handsontable(container, {\n data: [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n ],\n colHeaders: ['Q1', 'Q2', 'Q3', 'Q4'],\n rowHeaders: true,\n // Add two more row header columns next to the numbering.\n afterGetRowHeaderRenderers: (renderers: Array<(renderableRowIndex: number, TH: HTMLElement) => void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n },\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize: true,\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-header/javascript/example5.ts","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example1.tsx.json index 283b94af8..db5d5cfde 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row headers · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst data = generateData();\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example1.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row headers · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\n// Generate an array of arrays with a dummy data\nconst generateData = (rows = 3, columns = 7, additionalRows = true) => {\n let counter = 0;\n\n const array2d = [...new Array(rows)].map((_) => [...new Array(columns)].map((_) => counter++));\n\n if (additionalRows) {\n array2d.push([]);\n array2d.push([]);\n }\n\n return array2d;\n};\n\nconst data = generateData();\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example1.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example2.tsx.json index 05572ddaa..1fa65f702 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row headers · Row headers as an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example2.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row headers · Row headers as an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example2.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example3.tsx.json index 562ff179f..3a1e83e04 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row headers · Row headers as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n return `Row ${index + 1}`;\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example3.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row headers · Row headers as a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 31000, 11000],\n [45500, 33200, 12300],\n [48700, 35100, 13600],\n [51200, 36800, 14400],\n [54800, 38900, 15900],\n [57300, 40100, 17200],\n];\n\nconst ExampleComponent = () => {\n return (\n {\n return `Row ${index + 1}`;\n }}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example3.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example4.tsx.json index 1439ae09d..4dec94829 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row headers · Size the header to its content · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example4.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row headers · Size the header to its content · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example4.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example5.tsx.json index 32a2b80a3..d7e0b10a0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row headers · Add more row header columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\n\nconst data = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n];\n\nconst ExampleComponent = () => {\n return (\n void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n }}\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize={true}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example5.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row headers · Add more row header columns · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst groups = ['Top line', 'Direct costs', 'Margin', 'Overhead', 'Margin', 'Bottom line'];\nconst lineItems = [\n 'Revenue',\n 'Cost of goods sold',\n 'Gross profit',\n 'Operating expenses',\n 'Operating income',\n 'Net income',\n];\n\nconst data = [\n [42000, 45500, 48700, 51200],\n [18300, 19100, 20400, 21600],\n [23700, 26400, 28300, 29600],\n [9800, 10200, 11100, 11700],\n [13900, 16200, 17200, 17900],\n [11200, 13100, 13900, 14500],\n];\n\nconst ExampleComponent = () => {\n return (\n void>) => {\n // A renderer gets the renderable row index. It matches the visual index when no rows are hidden.\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = groups[renderableRowIndex];\n });\n renderers.push((renderableRowIndex, TH) => {\n TH.innerText = lineItems[renderableRowIndex];\n });\n }}\n // Measure each of the three row header columns on its own.\n autoRowHeaderSize={true}\n height=\"auto\"\n autoWrapRow={true}\n autoWrapCol={true}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-header/react/example5.tsx","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example1.vue.json index e303c202d..fbd3dc86c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row headers · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example1.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row headers · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example1.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example2.vue.json index 2155e2413..b07d6f8d7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row headers · Row headers as an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example2.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row headers · Row headers as an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example2.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example2","exampleTitle":"Row headers as an array","docPermalink":"/row-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example3.vue.json index b35b2b5e9..e1046fba7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row headers · Row headers as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example3.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row headers · Row headers as a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example3.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example3","exampleTitle":"Row headers as a function","docPermalink":"/row-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example4.vue.json index c011782f0..780ff1405 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row headers · Size the header to its content · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example4.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row headers · Size the header to its content · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example4.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example4","exampleTitle":"Size the header to its content","docPermalink":"/row-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example5.vue.json index 291b97263..e69321a1d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-header__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row headers · Add more row header columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example5.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row headers · Add more row header columns · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-header/vue/example5.vue","breadcrumb":["Rows","Row headers"],"guide":"guides/rows/row-header/row-header.md","guideTitle":"Row headers","exampleId":"example5","exampleTitle":"Add more row header columns","docPermalink":"/row-header","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example1.ts.json index d88822f7f..eb5d5037d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row heights · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example1.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row heights · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example1.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example2.ts.json index 38ed426d0..0714cedc6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row heights · Set row heights with an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ];\n\n readonly hotSettings: GridSettings = {\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example2.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row heights · Set row heights with an array · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ];\n\n readonly hotSettings: GridSettings = {\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example2.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example3.ts.json index 351e447db..3245e64b6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row heights · Set row heights with a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ];\n\n readonly hotSettings: GridSettings = {\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index: number) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example3.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row heights · Set row heights with a function · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ];\n\n readonly hotSettings: GridSettings = {\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index: number) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example3.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example4.ts.json index af2fdcd41..e4e95d9f1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row heights · Adjust row heights manually · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example4.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row heights · Adjust row heights manually · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example4.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example5.ts.json index 05d55805c..1285b615f 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example5.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-height/angular/example5.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.js.json index 6b6585408..66669f4c2 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row heights · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example1.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row heights · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example1.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.ts.json index 847bc81d8..84be5fd5e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row heights · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example1.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row heights · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example1.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.js.json index 9f272ef79..b958095e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row heights · Set row heights with an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example2.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row heights · Set row heights with an array · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example2.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.ts.json index 61caa6a8a..a611e5d31 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row heights · Set row heights with an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example2.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row heights · Set row heights with an array · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: [40, 40, 40, 40],\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example2.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.js.json index af473b5b4..df150ede0 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row heights · Set row heights with a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example3.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row heights · Set row heights with a function · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example3.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.ts.json index be1771df4..ebbe51d19 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row heights · Set row heights with a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container!, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example3.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row heights · Set row heights with a function · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container!, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ],\n width: '100%',\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights(index) {\n return (index + 1) * 20;\n },\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example3.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.js.json index 14a4fe919..c82feb127 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row heights · Adjust row heights manually · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n
    \n
    \n \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Demonstrates ManualRowResize#clearManualSizes(): drag the bottom edge of a row header\n// to resize a row, then click this button to drop the dragged heights.\nconst clearSizesButton = document.querySelector('#example4-clearSizes');\nclearSizesButton.addEventListener('click', () => {\n hot.getPlugin('manualRowResize').clearManualSizes();\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example4.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row heights · Adjust row heights manually · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n
    \n
    \n \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4');\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Demonstrates ManualRowResize#clearManualSizes(): drag the bottom edge of a row header\n// to resize a row, then click this button to drop the dragged heights.\nconst clearSizesButton = document.querySelector('#example4-clearSizes');\nclearSizesButton.addEventListener('click', () => {\n hot.getPlugin('manualRowResize').clearManualSizes();\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example4.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.ts.json index 96ddd05e5..d83a9383b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row heights · Adjust row heights manually · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n
    \n
    \n \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Demonstrates ManualRowResize#clearManualSizes(): drag the bottom edge of a row header\n// to resize a row, then click this button to drop the dragged heights.\nconst clearSizesButton = document.querySelector('#example4-clearSizes')!;\nclearSizesButton.addEventListener('click', () => {\n hot.getPlugin('manualRowResize').clearManualSizes();\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example4.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row heights · Adjust row heights manually · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n
    \n
    \n \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nconst hot = new Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n minRowHeights: 40,\n manualRowResize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Demonstrates ManualRowResize#clearManualSizes(): drag the bottom edge of a row header\n// to resize a row, then click this button to drop the dragged heights.\nconst clearSizesButton = document.querySelector('#example4-clearSizes')!;\nclearSizesButton.addEventListener('click', () => {\n hot.getPlugin('manualRowResize').clearManualSizes();\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example4.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.js.json index 2e1a92c32..a54d18a46 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n data: [\n [\n 'SKU-4821',\n 'Stainless Steel Water Bottle',\n 'Harbor Goods',\n 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.',\n ],\n [\n 'SKU-0093',\n 'Wireless Mouse',\n 'Alpine Supply Co.',\n 'Available in black and silver. The silver version is on backorder until the end of the month.',\n ],\n [\n 'SKU-1170',\n 'Ergonomic Office Chair',\n 'Cascade Distributors',\n 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.',\n ],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ],\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example5.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5');\n\nnew Handsontable(container, {\n data: [\n [\n 'SKU-4821',\n 'Stainless Steel Water Bottle',\n 'Harbor Goods',\n 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.',\n ],\n [\n 'SKU-0093',\n 'Wireless Mouse',\n 'Alpine Supply Co.',\n 'Available in black and silver. The silver version is on backorder until the end of the month.',\n ],\n [\n 'SKU-1170',\n 'Ergonomic Office Chair',\n 'Cascade Distributors',\n 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.',\n ],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ],\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-height/javascript/example5.js","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.ts.json index 5c50d3837..ef3eab176 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ],\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example5.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n ],\n colHeaders: ['SKU', 'Product', 'Supplier', 'Note'],\n colWidths: [100, 190, 170, 220],\n columns: [\n {},\n {},\n {},\n // show two lines of the note and end the second one with an ellipsis\n { textEllipsis: 2 },\n ],\n width: '100%',\n height: 'auto',\n rowHeaders: true,\n autoRowSize: true,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-height/javascript/example5.ts","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example1.tsx.json index d24826dee..6d793e04c 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row heights · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example1.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row heights · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example1.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example2.tsx.json index 31f9c0b4e..3c4c3d4c5 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row heights · Set row heights with an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example2.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row heights · Set row heights with an array · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example2.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example3.tsx.json index 4426795c0..b53df3ecf 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row heights · Set row heights with a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example3.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row heights · Set row heights with a function · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example3.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example4.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example4.tsx.json index a345e713e..7cee869f4 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example4.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example4.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row heights · Adjust row heights manually · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example4.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row heights · Adjust row heights manually · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example4\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example4.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example5.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example5.tsx.json index c2078a862..58e106a05 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example5.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__react__example5.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example5.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"React (TS)"} +{"framework":"react","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example5\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Ships in recyclable packaging. Harbor Goods needs ten days to restock this item, so order early.'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Available in black and silver. The silver version is on backorder until the end of the month.'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Assembly required. Cascade Distributors includes a hex key and a printed guide in the box.'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'In stock.'],\n];\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"guides/rows/row-height/react/example5.tsx","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example1.vue.json index 2f3a61337..330f3d84b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row heights · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example1.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row heights · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example1.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-height","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example2.vue.json index 1a7001381..2456d31d6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row heights · Set row heights with an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example2.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row heights · Set row heights with an array · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example2.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example2","exampleTitle":"Set row heights with an array","docPermalink":"/row-height","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example3.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example3.vue.json index 3597c106a..2f70c6d62 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example3.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example3.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row heights · Set row heights with a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example3.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row heights · Set row heights with a function · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example3\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example3.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example3","exampleTitle":"Set row heights with a function","docPermalink":"/row-height","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example4.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example4.vue.json index c2b702af0..6a8addd4a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example4.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example4.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row heights · Adjust row heights manually · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example4.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row heights · Adjust row heights manually · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example4\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example4.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example4","exampleTitle":"Adjust row heights manually","docPermalink":"/row-height","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example5.vue.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example5.vue.json index 235f383b9..da7dc318a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example5.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-height__vue__example5.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example5.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"Vue 3"} +{"framework":"vue","displayName":"Rows ▸ Row heights · Limit the number of lines in a cell · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example5\");","/src/App.vue":"\n\n"},"docsPath":"guides/rows/row-height/vue/example5.vue","breadcrumb":["Rows","Row heights"],"guide":"guides/rows/row-height/row-height.md","guideTitle":"Row heights","exampleId":"example5","exampleTitle":"Limit the number of lines in a cell","docPermalink":"/row-height","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example1.ts.json index dda9112cf..ea93a7e5a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example1.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example1',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example1.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example2.ts.json index 9048e0572..3218895aa 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example2.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example2',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example2.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example3.ts.json index 5a5af1b0a..bae941411 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example3.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example3',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example3.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example4.ts.json index ea9c89134..ab69bb395 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example4.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example4.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example4',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example4.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example5.ts.json index 25becaee3..18e233398 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example5.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example5.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example5',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example5.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example6.ts.json index 229698daa..ccff6e49d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__angular__example6.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example6.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"Angular"} +{"framework":"angular","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule} from '@handsontable/angular-wrapper';\n\n@Component({\n selector: 'app-example6',\n template: `\n \n \n `,\n standalone: true,\n imports: [HotTableModule],\n})\nexport class AppComponent {\n\n readonly hotData = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ];\n\n readonly hotSettings: GridSettings = {\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// register Handsontable's modules\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"guides/rows/row-hiding/angular/example6.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.js.json index 7f49355e3..bdcf17642 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example1.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example1');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example1.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.ts.json index 1cf9fa675..477a10a88 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example1.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example1.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.js.json index 8fcab2598..fdf1c1fbb 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example2.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example2');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example2.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.ts.json index 2aeea06a7..d79534b1e 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example2.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 1: Specify rows hidden by default · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the `HiddenRows` plugin\n hiddenRows: {\n // specify rows hidden by default\n rows: [3, 5, 9],\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example2.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example2","exampleTitle":"Step 1: Specify rows hidden by default","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.js.json index 3ef94b17f..a48a0356d 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example3.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example3');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example3.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.ts.json index 8510df368..620d3f8b3 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example3.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 2: Show UI indicators · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example3')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n hiddenRows: {\n rows: [3, 5, 9],\n // show UI indicators to mark hidden rows\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example3.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example3","exampleTitle":"Step 2: Show UI indicators","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.js.json index 3319afdcb..f0c74a53b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example4.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example4');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example4.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.ts.json index c52c49a15..169bb897b 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example4.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example4.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example4')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // enable the context menu\n contextMenu: true,\n // enable the `HiddenRows` plugin\n // automatically adds the context menu's row hiding items\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example4.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example4","exampleTitle":"Step 3: Set up context menu items","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.js.json index 062b2b5fb..025f42872 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example5.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example5');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example5.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.ts.json index f5cdfd220..229879ae6 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example5.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example5.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 3: Set up context menu items (2) · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example5')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n // individually add row hiding context menu items\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example5.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example5","exampleTitle":"Step 3: Set up context menu items (2)","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.js.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.js.json index 55fa2dc48..36a0d0bf1 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.js.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example6.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"JavaScript"} +{"framework":"javascript","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n// Register all Handsontable's modules.\nregisterAllModules();\nconst container = document.querySelector('#example6');\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"guides/rows/row-hiding/javascript/example6.js","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.ts.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.ts.json index 61e648cb4..a57cb44c7 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__javascript__example6.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example6.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"TypeScript"} +{"framework":"typescript","displayName":"Rows ▸ Row hiding · Step 4: Set up copy and paste behavior · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst container = document.querySelector('#example6')!;\n\nnew Handsontable(container, {\n licenseKey: 'non-commercial-and-evaluation',\n data: [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n ],\n height: 'auto',\n colHeaders: true,\n rowHeaders: true,\n contextMenu: ['hidden_rows_show', 'hidden_rows_hide'],\n hiddenRows: {\n rows: [3, 5, 9],\n indicators: true,\n // exclude hidden rows from copying and pasting\n copyPasteEnabled: false,\n },\n autoWrapRow: true,\n autoWrapCol: true,\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"guides/rows/row-hiding/javascript/example6.ts","breadcrumb":["Rows","Row hiding"],"guide":"guides/rows/row-hiding/row-hiding.md","guideTitle":"Row hiding","exampleId":"example6","exampleTitle":"Step 4: Set up copy and paste behavior","docPermalink":"/row-hiding","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__react__example1.tsx.json index ef283a819..8ff4af77a 100644 --- a/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/guides__rows__row-hiding__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Rows ▸ Row hiding · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\n// register Handsontable's modules\nregisterAllModules();\n\nconst data = [\n ['SKU-4821', 'Stainless Steel Water Bottle', 'Harbor Goods', 'Drinkware', 'Seattle'],\n ['SKU-0093', 'Wireless Mouse', 'Alpine Supply Co.', 'Electronics', 'Denver'],\n ['SKU-1170', 'Ergonomic Office Chair', 'Cascade Distributors', 'Furniture', 'Portland'],\n ['SKU-2208', 'USB-C Charging Cable', 'Summit Trading', 'Electronics', 'Austin'],\n ['SKU-3341', 'Aluminum Water Filter', 'Northgate Wholesale', 'Drinkware', 'Minneapolis'],\n ['SKU-4412', 'Canvas Tote Bag', 'Nordic Traders', 'Apparel', 'Boston'],\n ['SKU-5088', 'USB-C Hub', 'Harbor Goods', 'Electronics', 'Chicago'],\n ['SKU-6120', 'Ceramic Mug Set', 'Alpine Supply Co.', 'Drinkware', 'Phoenix'],\n ['SKU-7294', 'Desk Lamp', 'Cascade Distributors', 'Furniture', 'Atlanta'],\n ['SKU-8015', 'Laptop Stand', 'Summit Trading', 'Furniture', 'Dallas'],\n ['SKU-9166', 'Bluetooth Speaker', 'Northgate Wholesale', 'Electronics', 'San Jose'],\n ['SKU-1042', 'Standing Desk', 'Nordic Traders', 'Furniture', 'Columbus'],\n];\n\nconst ExampleComponent = () => {\n return (\n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered{{ lastShortcut }}
    Last submission{{ lastSubmission }}
    \n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n data = employees;\n lastShortcut = '—';\n lastSubmission = '—';\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'Start Date'],\n columns: [\n { data: 'name', type: 'text' },\n { data: 'department', type: 'text' },\n { data: 'role', type: 'text' },\n { data: 'salary', type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 } },\n { data: 'startDate', type: 'text' },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // Ctrl+D: duplicate the currently selected row\n gridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event: Event) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n\n if (row === null) {\n return;\n }\n\n const rowData = hot.getSourceDataAtRow(row) as Record;\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n this.lastShortcut = 'Ctrl+D -- row duplicated';\n this.cdr.markForCheck();\n },\n });\n\n // Ctrl+Shift+Enter: submit the grid data\n gridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event: Event) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader() as string[];\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n this.lastShortcut = 'Ctrl+Shift+Enter -- data submitted';\n this.lastSubmission = `[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`;\n this.cdr.markForCheck();\n },\n });\n }\n\n ngOnDestroy(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getShortcutManager().getContext('grid')?.removeShortcutsByGroup('customActions');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/accessibility/keyboard-shortcuts/angular/example1.ts","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Accessibility ▸ Custom keyboard shortcuts · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, OnDestroy, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst employees = [\n { name: 'Ana García', department: 'Engineering', role: 'Senior Developer', salary: 95000, startDate: '2021-03-15' },\n { name: 'James Okafor', department: 'Marketing', role: 'Marketing Manager', salary: 82000, startDate: '2020-07-01' },\n { name: 'Li Wei', department: 'Engineering', role: 'Frontend Developer', salary: 78000, startDate: '2022-01-10' },\n { name: 'Priya Nair', department: 'HR', role: 'HR Specialist', salary: 68000, startDate: '2019-11-20' },\n { name: 'Carlos Mendes', department: 'Finance', role: 'Financial Analyst', salary: 88000, startDate: '2021-09-05' },\n { name: 'Fatima Al-Hassan', department: 'Engineering', role: 'Backend Developer', salary: 92000, startDate: '2020-04-18' },\n { name: 'Noah Kim', department: 'Design', role: 'UX Designer', salary: 75000, startDate: '2023-02-14' },\n { name: 'Sara Lindqvist', department: 'Marketing', role: 'Content Strategist', salary: 71000, startDate: '2019-06-30' },\n];\n/* end:skip-in-preview */\n\n@Component({\n selector: 'example1-keyboard-shortcuts',\n standalone: true,\n imports: [HotTableModule],\n template: `\n \n Shortcut log:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered{{ lastShortcut }}
    Last submission{{ lastSubmission }}
    \n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n data = employees;\n lastShortcut = '—';\n lastSubmission = '—';\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'Start Date'],\n columns: [\n { data: 'name', type: 'text' },\n { data: 'department', type: 'text' },\n { data: 'role', type: 'text' },\n { data: 'salary', type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 } },\n { data: 'startDate', type: 'text' },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n ngAfterViewInit(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n if (!gridContext) {\n return;\n }\n\n // Ctrl+D: duplicate the currently selected row\n gridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event: Event) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n\n if (row === null) {\n return;\n }\n\n const rowData = hot.getSourceDataAtRow(row) as Record;\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n this.lastShortcut = 'Ctrl+D -- row duplicated';\n this.cdr.markForCheck();\n },\n });\n\n // Ctrl+Shift+Enter: submit the grid data\n gridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event: Event) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader() as string[];\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n this.lastShortcut = 'Ctrl+Shift+Enter -- data submitted';\n this.lastSubmission = `[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`;\n this.cdr.markForCheck();\n },\n });\n }\n\n ngOnDestroy(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getShortcutManager().getContext('grid')?.removeShortcutsByGroup('customActions');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/accessibility/keyboard-shortcuts/angular/example1.ts","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__javascript__example1.js.json index 1ce9d5091..46f6457f2 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Accessibility ▸ Custom keyboard shortcuts · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n Shortcut log:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered—
    Last submission—
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst employees = [\n { name: 'Ana García', department: 'Engineering', role: 'Senior Developer', salary: 95000, startDate: '2021-03-15' },\n { name: 'James Okafor', department: 'Marketing', role: 'Marketing Manager', salary: 82000, startDate: '2020-07-01' },\n { name: 'Li Wei', department: 'Engineering', role: 'Frontend Developer', salary: 78000, startDate: '2022-01-10' },\n { name: 'Priya Nair', department: 'HR', role: 'HR Specialist', salary: 68000, startDate: '2019-11-20' },\n { name: 'Carlos Mendes', department: 'Finance', role: 'Financial Analyst', salary: 88000, startDate: '2021-09-05' },\n { name: 'Fatima Al-Hassan', department: 'Engineering', role: 'Backend Developer', salary: 92000, startDate: '2020-04-18' },\n { name: 'Noah Kim', department: 'Design', role: 'UX Designer', salary: 75000, startDate: '2023-02-14' },\n { name: 'Sara Lindqvist', department: 'Marketing', role: 'Content Strategist', salary: 71000, startDate: '2019-06-30' },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: employees,\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'Start Date'],\n columns: [\n { data: 'name', type: 'text' },\n { data: 'department', type: 'text' },\n { data: 'role', type: 'text' },\n { data: 'salary', type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 } },\n { data: 'startDate', type: 'text' },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst preview = container.closest('.hot-example-preview') ?? container.parentElement;\nconst lastShortcutEl = preview.querySelector('.last-shortcut');\nconst lastSubmissionEl = preview.querySelector('.last-submission');\n\nconst gridContext = hot.getShortcutManager().getContext('grid');\n\n// Ctrl+D: duplicate the currently selected row\ngridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n const rowData = hot.getSourceDataAtRow(row);\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n lastShortcutEl.textContent = 'Ctrl+D -- row duplicated';\n },\n});\n\n// Ctrl+Shift+Enter: submit the grid data\ngridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader();\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n lastShortcutEl.textContent = 'Ctrl+Shift+Enter -- data submitted';\n lastSubmissionEl.textContent = `[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/accessibility/keyboard-shortcuts/javascript/example1.js","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Accessibility ▸ Custom keyboard shortcuts · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n Shortcut log:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered—
    Last submission—
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst employees = [\n { name: 'Ana García', department: 'Engineering', role: 'Senior Developer', salary: 95000, startDate: '2021-03-15' },\n { name: 'James Okafor', department: 'Marketing', role: 'Marketing Manager', salary: 82000, startDate: '2020-07-01' },\n { name: 'Li Wei', department: 'Engineering', role: 'Frontend Developer', salary: 78000, startDate: '2022-01-10' },\n { name: 'Priya Nair', department: 'HR', role: 'HR Specialist', salary: 68000, startDate: '2019-11-20' },\n { name: 'Carlos Mendes', department: 'Finance', role: 'Financial Analyst', salary: 88000, startDate: '2021-09-05' },\n { name: 'Fatima Al-Hassan', department: 'Engineering', role: 'Backend Developer', salary: 92000, startDate: '2020-04-18' },\n { name: 'Noah Kim', department: 'Design', role: 'UX Designer', salary: 75000, startDate: '2023-02-14' },\n { name: 'Sara Lindqvist', department: 'Marketing', role: 'Content Strategist', salary: 71000, startDate: '2019-06-30' },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: employees,\n colHeaders: ['Name', 'Department', 'Role', 'Salary', 'Start Date'],\n columns: [\n { data: 'name', type: 'text' },\n { data: 'department', type: 'text' },\n { data: 'role', type: 'text' },\n { data: 'salary', type: 'numeric', locale: 'en-US', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 } },\n { data: 'startDate', type: 'text' },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst preview = container.closest('.hot-example-preview') ?? container.parentElement;\nconst lastShortcutEl = preview.querySelector('.last-shortcut');\nconst lastSubmissionEl = preview.querySelector('.last-submission');\n\nconst gridContext = hot.getShortcutManager().getContext('grid');\n\n// Ctrl+D: duplicate the currently selected row\ngridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n const rowData = hot.getSourceDataAtRow(row);\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n lastShortcutEl.textContent = 'Ctrl+D -- row duplicated';\n },\n});\n\n// Ctrl+Shift+Enter: submit the grid data\ngridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader();\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n lastShortcutEl.textContent = 'Ctrl+Shift+Enter -- data submitted';\n lastSubmissionEl.textContent = `[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`;\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/accessibility/keyboard-shortcuts/javascript/example1.js","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__react__example1.tsx.json index 8c807623d..823d88dc4 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__accessibility__keyboard-shortcuts__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Accessibility ▸ Custom keyboard shortcuts · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type Handsontable from 'handsontable/base';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst employees = [\n { name: 'Ana García', department: 'Engineering', role: 'Senior Developer', salary: 95000, startDate: '2021-03-15' },\n { name: 'James Okafor', department: 'Marketing', role: 'Marketing Manager', salary: 82000, startDate: '2020-07-01' },\n { name: 'Li Wei', department: 'Engineering', role: 'Frontend Developer', salary: 78000, startDate: '2022-01-10' },\n { name: 'Priya Nair', department: 'HR', role: 'HR Specialist', salary: 68000, startDate: '2019-11-20' },\n { name: 'Carlos Mendes', department: 'Finance', role: 'Financial Analyst', salary: 88000, startDate: '2021-09-05' },\n { name: 'Fatima Al-Hassan', department: 'Engineering', role: 'Backend Developer', salary: 92000, startDate: '2020-04-18' },\n { name: 'Noah Kim', department: 'Design', role: 'UX Designer', salary: 75000, startDate: '2023-02-14' },\n { name: 'Sara Lindqvist', department: 'Marketing', role: 'Content Strategist', salary: 71000, startDate: '2019-06-30' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef<{ hotInstance: Handsontable | null } | null>(null);\n const [lastShortcut, setLastShortcut] = useState('—');\n const [lastSubmission, setLastSubmission] = useState('—');\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n // Ctrl+D: duplicate the currently selected row\n gridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event: KeyboardEvent) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n const rowData = hot.getSourceDataAtRow(row) as Record;\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n setLastShortcut('Ctrl+D -- row duplicated');\n },\n });\n\n // Ctrl+Shift+Enter: submit the grid data\n gridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event: KeyboardEvent) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader() as string[];\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n setLastShortcut('Ctrl+Shift+Enter -- data submitted');\n setLastSubmission(`[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`);\n },\n });\n\n return () => {\n gridContext.removeShortcutsByGroup('customActions');\n };\n }, []);\n\n return (\n <>\n \n Shortcut log:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered{lastShortcut}
    Last submission{lastSubmission}
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/accessibility/keyboard-shortcuts/react/example1.tsx","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Accessibility ▸ Custom keyboard shortcuts · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type Handsontable from 'handsontable/base';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst employees = [\n { name: 'Ana García', department: 'Engineering', role: 'Senior Developer', salary: 95000, startDate: '2021-03-15' },\n { name: 'James Okafor', department: 'Marketing', role: 'Marketing Manager', salary: 82000, startDate: '2020-07-01' },\n { name: 'Li Wei', department: 'Engineering', role: 'Frontend Developer', salary: 78000, startDate: '2022-01-10' },\n { name: 'Priya Nair', department: 'HR', role: 'HR Specialist', salary: 68000, startDate: '2019-11-20' },\n { name: 'Carlos Mendes', department: 'Finance', role: 'Financial Analyst', salary: 88000, startDate: '2021-09-05' },\n { name: 'Fatima Al-Hassan', department: 'Engineering', role: 'Backend Developer', salary: 92000, startDate: '2020-04-18' },\n { name: 'Noah Kim', department: 'Design', role: 'UX Designer', salary: 75000, startDate: '2023-02-14' },\n { name: 'Sara Lindqvist', department: 'Marketing', role: 'Content Strategist', salary: 71000, startDate: '2019-06-30' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef<{ hotInstance: Handsontable | null } | null>(null);\n const [lastShortcut, setLastShortcut] = useState('—');\n const [lastSubmission, setLastSubmission] = useState('—');\n\n useEffect(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const gridContext = hot.getShortcutManager().getContext('grid');\n\n // Ctrl+D: duplicate the currently selected row\n gridContext.addShortcut({\n keys: [['Control', 'd']],\n group: 'customActions',\n runOnlyIf: () => hot.getSelected() !== undefined,\n callback: (event: KeyboardEvent) => {\n event.preventDefault();\n\n const selectedRange = hot.getSelectedRangeLast();\n\n if (!selectedRange) {\n return;\n }\n\n const row = selectedRange.from.row;\n const rowData = hot.getSourceDataAtRow(row) as Record;\n\n hot.alter('insert_row_below', row);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n\n setLastShortcut('Ctrl+D -- row duplicated');\n },\n });\n\n // Ctrl+Shift+Enter: submit the grid data\n gridContext.addShortcut({\n keys: [['Control', 'Shift', 'Enter']],\n group: 'customActions',\n runOnlyIf: () => true,\n callback: (event: KeyboardEvent) => {\n event.preventDefault();\n\n const data = hot.getData();\n const headers = hot.getColHeader() as string[];\n const rowCount = data.length;\n const timestamp = new Date().toLocaleTimeString();\n\n setLastShortcut('Ctrl+Shift+Enter -- data submitted');\n setLastSubmission(`[${timestamp}] Submitted ${rowCount} rows -- columns: ${headers.join(', ')}`);\n },\n });\n\n return () => {\n gridContext.removeShortcutsByGroup('customActions');\n };\n }, []);\n\n return (\n <>\n \n Shortcut log:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Last shortcut triggered{lastShortcut}
    Last submission{lastSubmission}
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/accessibility/keyboard-shortcuts/react/example1.tsx","breadcrumb":["Recipes","Accessibility","Custom keyboard shortcuts"],"guide":"recipes/accessibility/keyboard-shortcuts/keyboard-shortcuts.md","guideTitle":"Custom keyboard shortcuts","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/accessibility/keyboard-shortcuts","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__angular__example1.ts.json index 5fba3581d..3af938f77 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\n\n/* start:skip-in-preview */\nconst inputData = [\n { id: 640329, itemName: 'Lunar Core', itemNo: 'XJ-12', cost: 350000, valueStock: 700000 },\n { id: 863104, itemName: 'Zero Thrusters', itemNo: 'QL-54', cost: 450000, valueStock: 0 },\n { id: 395603, itemName: 'EVA Suits', itemNo: 'PM-67', cost: 150000, valueStock: 7500000 },\n { id: 679083, itemName: 'Solar Panels', itemNo: 'BW-09', cost: 75000, valueStock: 750000 },\n { id: 912663, itemName: 'Comm Array', itemNo: 'ZR-56', cost: 125000, valueStock: 0 },\n { id: 315806, itemName: 'Habitat Dome', itemNo: 'UJ-23', cost: 1000000, valueStock: 3000000 },\n { id: 954632, itemName: 'Oxygen Unit', itemNo: 'FK-87', cost: 600000, valueStock: 9000000 },\n { id: 734944, itemName: 'Processing Rig', itemNo: 'LK-13', cost: 350000, valueStock: 8750000 },\n];\n/* end:skip-in-preview */\n\nconst colorValidator = (value: string): boolean => /^#[0-9A-Fa-f]{6}$/.test(value);\n\n@Component({\n standalone: true,\n selector: 'example1-color-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n \n
    `,\n styles: `\n :host { height: 100%; width: 100%; }\n .color-picker-cell { display: flex; align-items: center; justify-content: center; }\n .color-picker-swatch { width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; border: 1px solid rgba(0,0,0,0.15); }\n `,\n})\nexport class ColorRendererComponent extends HotCellRendererAdvancedComponent {}\n\n@Component({\n standalone: true,\n selector: 'example1-color-picker-editor',\n template: `\n
    \n \n
    \n `,\n styles: `\n :host { width: 100%; height: 100%; }\n .color-picker-editor { width: 100%; height: 100%; border: none; outline: none; box-sizing: border-box !important; cursor: pointer; }\n `,\n})\nexport class ColorPickerEditorComponent extends HotCellEditorAdvancedComponent {\n @ViewChild('colorInput', { static: true }) colorInput!: ElementRef;\n @ViewChild('editorContainer', { static: true }) editorContainer!: ElementRef;\n\n private pickrInstance: Pickr | null = null;\n private pickrButton: HTMLButtonElement | null = null;\n private openedAt = 0;\n\n override afterOpen(): void {\n this.openedAt = Date.now();\n this.colorInput.nativeElement.value = this.value || '#000000';\n\n this.pickrButton = document.createElement('button');\n this.pickrButton.textContent = 'Open color picker';\n this.pickrButton.style.cssText = 'position:absolute;opacity:0;pointer-events:none;';\n this.editorContainer.nativeElement.appendChild(this.pickrButton);\n const button = this.pickrButton;\n\n this.pickrInstance = Pickr.create({\n el: button,\n theme: 'nano',\n default: this.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: { preview: true, hue: true },\n });\n\n (this.pickrInstance as any)._root.root.style.height = '0';\n (this.pickrInstance as any)._root.root.style.overflow = 'hidden';\n\n this.pickrInstance.on('change', (color: { toHEXA: () => { toString: () => string } } | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n this.colorInput.nativeElement.value = hex;\n this.setValue(hex);\n }\n });\n\n this.pickrInstance.on('hide', () => {\n if (Date.now() - this.openedAt < 400) {\n this.pickrInstance?.show();\n return;\n }\n this.finishEdit.emit();\n });\n\n this.pickrInstance.show();\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = this.editorContainer.nativeElement.getBoundingClientRect();\n\n if (cellRect && this.pickrInstance) {\n (this.pickrInstance as any)._root.app.style.top = `${cellRect.bottom}px`;\n }\n });\n });\n }\n\n override afterClose(): void {\n (this.pickrInstance as any)?._root.app.classList.remove('visible');\n this.pickrInstance?.hide();\n this.pickrInstance?.destroy();\n this.pickrInstance = null;\n this.pickrButton?.remove();\n this.pickrButton = null;\n }\n\n override onFocus(): void {\n this.colorInput.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-color-picker',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n color: `#${Math.round(0x1000000 + 0xffffff * Math.random()).toString(16).slice(1).toUpperCase()}`,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n columns: [\n { data: 'id', type: 'numeric', width: 80, headerClassName: 'htLeft' },\n { data: 'itemName', type: 'text', width: 200, headerClassName: 'htLeft' },\n {\n data: 'color',\n headerClassName: 'htLeft',\n editor: ColorPickerEditorComponent,\n renderer: ColorRendererComponent,\n validator: colorValidator,\n } as any,\n { data: 'itemNo', type: 'text', width: 100, headerClassName: 'htLeft' },\n { data: 'cost', type: 'numeric', width: 70, headerClassName: 'htLeft' },\n { data: 'valueStock', type: 'numeric', width: 130, headerClassName: 'htRight' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/color-picker/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\n\n/* start:skip-in-preview */\nconst inputData = [\n { id: 640329, itemName: 'Lunar Core', itemNo: 'XJ-12', cost: 350000, valueStock: 700000 },\n { id: 863104, itemName: 'Zero Thrusters', itemNo: 'QL-54', cost: 450000, valueStock: 0 },\n { id: 395603, itemName: 'EVA Suits', itemNo: 'PM-67', cost: 150000, valueStock: 7500000 },\n { id: 679083, itemName: 'Solar Panels', itemNo: 'BW-09', cost: 75000, valueStock: 750000 },\n { id: 912663, itemName: 'Comm Array', itemNo: 'ZR-56', cost: 125000, valueStock: 0 },\n { id: 315806, itemName: 'Habitat Dome', itemNo: 'UJ-23', cost: 1000000, valueStock: 3000000 },\n { id: 954632, itemName: 'Oxygen Unit', itemNo: 'FK-87', cost: 600000, valueStock: 9000000 },\n { id: 734944, itemName: 'Processing Rig', itemNo: 'LK-13', cost: 350000, valueStock: 8750000 },\n];\n/* end:skip-in-preview */\n\nconst colorValidator = (value: string): boolean => /^#[0-9A-Fa-f]{6}$/.test(value);\n\n@Component({\n standalone: true,\n selector: 'example1-color-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n \n
    `,\n styles: `\n :host { height: 100%; width: 100%; }\n .color-picker-cell { display: flex; align-items: center; justify-content: center; }\n .color-picker-swatch { width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; border: 1px solid rgba(0,0,0,0.15); }\n `,\n})\nexport class ColorRendererComponent extends HotCellRendererAdvancedComponent {}\n\n@Component({\n standalone: true,\n selector: 'example1-color-picker-editor',\n template: `\n
    \n \n
    \n `,\n styles: `\n :host { width: 100%; height: 100%; }\n .color-picker-editor { width: 100%; height: 100%; border: none; outline: none; box-sizing: border-box !important; cursor: pointer; }\n `,\n})\nexport class ColorPickerEditorComponent extends HotCellEditorAdvancedComponent {\n @ViewChild('colorInput', { static: true }) colorInput!: ElementRef;\n @ViewChild('editorContainer', { static: true }) editorContainer!: ElementRef;\n\n private pickrInstance: Pickr | null = null;\n private pickrButton: HTMLButtonElement | null = null;\n private openedAt = 0;\n\n override afterOpen(): void {\n this.openedAt = Date.now();\n this.colorInput.nativeElement.value = this.value || '#000000';\n\n this.pickrButton = document.createElement('button');\n this.pickrButton.textContent = 'Open color picker';\n this.pickrButton.style.cssText = 'position:absolute;opacity:0;pointer-events:none;';\n this.editorContainer.nativeElement.appendChild(this.pickrButton);\n const button = this.pickrButton;\n\n this.pickrInstance = Pickr.create({\n el: button,\n theme: 'nano',\n default: this.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: { preview: true, hue: true },\n });\n\n (this.pickrInstance as any)._root.root.style.height = '0';\n (this.pickrInstance as any)._root.root.style.overflow = 'hidden';\n\n this.pickrInstance.on('change', (color: { toHEXA: () => { toString: () => string } } | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n this.colorInput.nativeElement.value = hex;\n this.setValue(hex);\n }\n });\n\n this.pickrInstance.on('hide', () => {\n if (Date.now() - this.openedAt < 400) {\n this.pickrInstance?.show();\n return;\n }\n this.finishEdit.emit();\n });\n\n this.pickrInstance.show();\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = this.editorContainer.nativeElement.getBoundingClientRect();\n\n if (cellRect && this.pickrInstance) {\n (this.pickrInstance as any)._root.app.style.top = `${cellRect.bottom}px`;\n }\n });\n });\n }\n\n override afterClose(): void {\n (this.pickrInstance as any)?._root.app.classList.remove('visible');\n this.pickrInstance?.hide();\n this.pickrInstance?.destroy();\n this.pickrInstance = null;\n this.pickrButton?.remove();\n this.pickrButton = null;\n }\n\n override onFocus(): void {\n this.colorInput.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-color-picker',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n color: `#${Math.round(0x1000000 + 0xffffff * Math.random()).toString(16).slice(1).toUpperCase()}`,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n columns: [\n { data: 'id', type: 'numeric', width: 80, headerClassName: 'htLeft' },\n { data: 'itemName', type: 'text', width: 200, headerClassName: 'htLeft' },\n {\n data: 'color',\n headerClassName: 'htLeft',\n editor: ColorPickerEditorComponent,\n renderer: ColorRendererComponent,\n validator: colorValidator,\n } as any,\n { data: 'itemNo', type: 'text', width: 100, headerClassName: 'htLeft' },\n { data: 'cost', type: 'numeric', width: 70, headerClassName: 'htLeft' },\n { data: 'valueStock', type: 'numeric', width: 130, headerClassName: 'htRight' },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/color-picker/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.js.json index e384fd6f2..f6756c128 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n }),\n validator: (value, callback) => {\n callback(value.length === 7 && value[0] == '#'); // validate color format\n },\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button');\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n }\n });\n\n // Collapse the Pickr trigger button so it doesn't add vertical space\n // between the cell editor and the popup.\n editor.pickr._root.root.style.height = '0';\n editor.pickr._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = editor.pickr._root.app;\n\n editor.pickr.on('change', (color) => {\n if (color) {\n const hex = color.toHEXA().toString();\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n // Pickr positions its popup relative to the trigger button with an\n // internal offset. Override the top to sit flush below the cell.\n // Use double-rAF to ensure Pickr's own positioning is complete.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.pickr._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n editor.pickr._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n columns: [\n {\n data: 'id',\n type: 'numeric',\n width: 80,\n headerClassName: 'htLeft',\n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft',\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n ...cellDefinition,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n }),\n validator: (value, callback) => {\n callback(value.length === 7 && value[0] == '#'); // validate color format\n },\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button');\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n }\n });\n\n // Collapse the Pickr trigger button so it doesn't add vertical space\n // between the cell editor and the popup.\n editor.pickr._root.root.style.height = '0';\n editor.pickr._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = editor.pickr._root.app;\n\n editor.pickr.on('change', (color) => {\n if (color) {\n const hex = color.toHEXA().toString();\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n // Pickr positions its popup relative to the trigger button with an\n // internal offset. Override the top to sit flush below the cell.\n // Use double-rAF to ensure Pickr's own positioning is complete.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.pickr._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n editor.pickr._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n columns: [\n {\n data: 'id',\n type: 'numeric',\n width: 80,\n headerClassName: 'htLeft',\n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft',\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n ...cellDefinition,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.ts.json index fec74da93..888b20035 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\nimport { CellProperties } from 'handsontable/settings';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n }\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\ntype ColorPickerEditor = { input: HTMLInputElement; pickr: ReturnType; preventCloseElement: HTMLElement };\n\nconst cellDefinition: Pick = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n }),\n validator: (value, callback) => {\n callback(value.length === 7 && value[0] == '#'); // validate color format\n },\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button');\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n }\n });\n\n // Collapse the Pickr trigger button so it doesn't add vertical space\n // between the cell editor and the popup.\n editor.pickr._root.root.style.height = '0';\n editor.pickr._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = editor.pickr._root.app;\n\n editor.pickr.on('change', (color: { toHEXA: () => { toString: () => string } } | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n // Pickr positions its popup relative to the trigger button with an\n // internal offset. Override the top to sit flush below the cell.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.pickr._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n editor.pickr._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n columns: [\n { \n data: 'id', \n type: 'numeric', \n width: 80, \n headerClassName: 'htLeft' \n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft'\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n ...cellDefinition,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\nimport { CellProperties } from 'handsontable/settings';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n }\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\ntype ColorPickerEditor = { input: HTMLInputElement; pickr: ReturnType; preventCloseElement: HTMLElement };\n\nconst cellDefinition: Pick = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n }),\n validator: (value, callback) => {\n callback(value.length === 7 && value[0] == '#'); // validate color format\n },\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button');\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n }\n });\n\n // Collapse the Pickr trigger button so it doesn't add vertical space\n // between the cell editor and the popup.\n editor.pickr._root.root.style.height = '0';\n editor.pickr._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = editor.pickr._root.app;\n\n editor.pickr.on('change', (color: { toHEXA: () => { toString: () => string } } | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n // Pickr positions its popup relative to the trigger button with an\n // internal offset. Override the top to sit flush below the cell.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.pickr._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n editor.pickr._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n columns: [\n { \n data: 'id', \n type: 'numeric', \n width: 80, \n headerClassName: 'htLeft' \n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft'\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n ...cellDefinition,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__react__example1.tsx.json index af6ce2d01..f0dd66351 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__color-picker__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\nimport './example1.css';\n\nregisterAllModules();\n\ninterface ColorPickerEditorInstance {\n input: HTMLInputElement;\n pickr: Pickr;\n _openedAt: number;\n preventCloseElement: HTMLElement;\n}\n\nconst colorPickerRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n});\n\nconst colorPickerValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(value.length === 7 && value[0] === '#');\n};\n\nconst colorPickerEditor = editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button') as HTMLButtonElement;\n\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n },\n });\n\n (editor.pickr as any)._root.root.style.height = '0';\n (editor.pickr as any)._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = (editor.pickr as any)._root.app;\n\n editor.pickr.on('change', (color: Pickr.HSVaColor | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n (editor.pickr as any)._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n (editor.pickr as any)._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n});\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n color?: string;\n}\n\nconst inputData: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"@simonwep/pickr\": \"1.10.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport Pickr from '@simonwep/pickr';\nimport '@simonwep/pickr/dist/themes/nano.min.css';\nimport './example1.css';\n\nregisterAllModules();\n\ninterface ColorPickerEditorInstance {\n input: HTMLInputElement;\n pickr: Pickr;\n _openedAt: number;\n preventCloseElement: HTMLElement;\n}\n\nconst colorPickerRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n});\n\nconst colorPickerValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(value.length === 7 && value[0] === '#');\n};\n\nconst colorPickerEditor = editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.setAttribute('aria-label', 'Open color picker');\n editor.input.classList.add('color-picker-editor');\n },\n afterInit(editor) {\n const button = editor.hot.rootDocument.createElement('button') as HTMLButtonElement;\n\n button.textContent = 'Open color picker';\n button.classList.add('color-picker-button');\n editor.input.after(button);\n\n editor.pickr = Pickr.create({\n el: button,\n theme: 'nano',\n default: editor.input.value || '#000000',\n autoReposition: false,\n padding: 0,\n components: {\n preview: true,\n hue: true,\n },\n });\n\n (editor.pickr as any)._root.root.style.height = '0';\n (editor.pickr as any)._root.root.style.overflow = 'hidden';\n\n editor.preventCloseElement = (editor.pickr as any)._root.app;\n\n editor.pickr.on('change', (color: Pickr.HSVaColor | null) => {\n if (color) {\n const hex = color.toHEXA().toString();\n\n editor.input.value = hex;\n }\n });\n\n editor.pickr.on('hide', () => {\n if (Date.now() - editor._openedAt < 400) {\n editor.pickr.show();\n\n return;\n }\n editor.finishEditing();\n });\n },\n afterOpen(editor) {\n editor._openedAt = Date.now();\n editor.pickr.setColor(editor.input.value || '#000000');\n editor.pickr.show();\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n const cellRect = editor.TD.getBoundingClientRect();\n\n (editor.pickr as any)._root.app.style.top = `${cellRect.bottom}px`;\n });\n });\n },\n afterClose(editor) {\n (editor.pickr as any)._root.app.classList.remove('visible');\n editor.pickr.hide();\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n shortcuts: [\n {\n keys: [['Tab']],\n callback: (editor) => {\n editor.pickr.hide();\n },\n },\n ],\n});\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n color?: string;\n}\n\nconst inputData: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n border: none;\n outline: none;\n box-sizing: border-box !important;\n cursor: pointer;\n -webkit-appearance: none;\n appearance: none;\n}\n\n.pickr {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n}\n\nhtml[data-theme=\"dark\"] .pcr-app {\n background-color: #1a1a1a;\n}"},"docsPath":"recipes/cell-types/color-picker/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/color-picker/color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__colorful-picker__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__colorful-picker__react__example1.tsx.json index e86a5059c..654d3dcb2 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__colorful-picker__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__colorful-picker__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Colorful Picker · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"react-colorful\": \"5.8.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { HexColorPicker } from 'react-colorful';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nexport const data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\nconst colorCellRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n});\n\nconst colorValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(value.length === 7 && value[0] === '#'); // validate color format\n};\n\nexport const ColorPickerEditor = () => {\n return (\n \n {({ value, setValue }) => (\n
    \n \n
    \n setValue(color)} />\n
    \n
    \n )}\n
    \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n}\n\n.color-picker-editor-popover {\n position: absolute;\n top: 100%;\n left: 0;\n padding-top: 8px;\n}\n\n.color-picker-editor:focus {\n outline: none;\n}\n\n.color-picker-editor-input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n}"},"docsPath":"recipes/cell-types/colorful-picker/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Colorful Picker"],"guide":"recipes/cell-types/colorful-picker/colorful-picker.md","guideTitle":"Colorful Picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/colorful-picker","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Colorful Picker · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"react-colorful\": \"5.8.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { HexColorPicker } from 'react-colorful';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nexport const data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n}));\n/* end:skip-in-preview */\n\nconst colorCellRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = ``;\n});\n\nconst colorValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(value.length === 7 && value[0] === '#'); // validate color format\n};\n\nexport const ColorPickerEditor = () => {\n return (\n \n {({ value, setValue }) => (\n
    \n \n
    \n setValue(color)} />\n
    \n
    \n )}\n
    \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.color-picker-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n}\n\n.color-picker-editor-popover {\n position: absolute;\n top: 100%;\n left: 0;\n padding-top: 8px;\n}\n\n.color-picker-editor:focus {\n outline: none;\n}\n\n.color-picker-editor-input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n}"},"docsPath":"recipes/cell-types/colorful-picker/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Colorful Picker"],"guide":"recipes/cell-types/colorful-picker/colorful-picker.md","guideTitle":"Colorful Picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/colorful-picker","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback-react__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback-react__react__example1.tsx.json index 06d8d63f5..23348b33a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback-react__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback-react__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, ComponentProps, useCallback } from 'react';\nimport { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\n// register Handsontable's modules\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nexport const data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n\n/* end:skip-in-preview */\n\n\ntype EditorComponentProps = ComponentProps>;\n\nexport const FeedbackEditor = () => {\n const [config, setConfig] = useState(['👍', '👎', '🤷']);\n const [shortcuts, setShortcuts] = useState([]);\n const onPrepare: EditorComponentProps['onPrepare'] = (_row, _column, _prop, _TD, _originalValue, cellProperties) => {\n setConfig(cellProperties.config as string[]);\n };\n\n useEffect(() => {\n setShortcuts([\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: ({value, setValue}, _event) => {\n setValue(getNextValue(value)); \n return false;\n }\n }, \n {\n keys: [['ArrowLeft']],\n callback: ({value, setValue}, _event) => {\n setValue(getPrevValue(value)); \n }\n }\n ])\n }, [config]);\n\n const getNextValue = useCallback((value: string) => {\n const index = config.indexOf(value);\n return index === config.length - 1 ? config[0] : config[index + 1];\n }, [config]);\n\n const getPrevValue = useCallback((value: string) => {\n const index = config.indexOf(value);\n return index === 0 ? config[config.length - 1] : config[index - 1];\n }, [config]);\n\n return (\n onPrepare={onPrepare} shortcuts={shortcuts}>\n {({ value, setValue, finishEditing }) => (\n <>\n
    \n {config.map((item, _index, _array) => (\n {\n setValue(item);\n finishEditing();\n }}\n style={{\n width: 100 / _array.length + '%'\n }}\n >\n {item}\n \n ))}\n
    \n \n )}\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n }\n \n .feedback-editor button {\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n }\n \n .feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n }\n \n .feedback-editor button.active,\n .feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n }"},"docsPath":"recipes/cell-types/feedback-react/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback-react/feedback-react.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback-react","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, ComponentProps, useCallback } from 'react';\nimport { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\n// register Handsontable's modules\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nexport const data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n\n/* end:skip-in-preview */\n\n\ntype EditorComponentProps = ComponentProps>;\n\nexport const FeedbackEditor = () => {\n const [config, setConfig] = useState(['👍', '👎', '🤷']);\n const [shortcuts, setShortcuts] = useState([]);\n const onPrepare: EditorComponentProps['onPrepare'] = (_row, _column, _prop, _TD, _originalValue, cellProperties) => {\n setConfig(cellProperties.config as string[]);\n };\n\n useEffect(() => {\n setShortcuts([\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: ({value, setValue}, _event) => {\n setValue(getNextValue(value)); \n return false;\n }\n }, \n {\n keys: [['ArrowLeft']],\n callback: ({value, setValue}, _event) => {\n setValue(getPrevValue(value)); \n }\n }\n ])\n }, [config]);\n\n const getNextValue = useCallback((value: string) => {\n const index = config.indexOf(value);\n return index === config.length - 1 ? config[0] : config[index + 1];\n }, [config]);\n\n const getPrevValue = useCallback((value: string) => {\n const index = config.indexOf(value);\n return index === 0 ? config[config.length - 1] : config[index - 1];\n }, [config]);\n\n return (\n onPrepare={onPrepare} shortcuts={shortcuts}>\n {({ value, setValue, finishEditing }) => (\n <>\n
    \n {config.map((item, _index, _array) => (\n {\n setValue(item);\n finishEditing();\n }}\n style={{\n width: 100 / _array.length + '%'\n }}\n >\n {item}\n \n ))}\n
    \n \n )}\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n }\n \n .feedback-editor button {\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n }\n \n .feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n }\n \n .feedback-editor button.active,\n .feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n }"},"docsPath":"recipes/cell-types/feedback-react/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback-react/feedback-react.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback-react","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__angular__example1.ts.json index 5abc5db97..356924ba8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotCellEditorAdvancedComponent, KeyboardShortcutConfig, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst inputData = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n selector: 'example1-feedback-editor',\n template: `\n
    \n @for (option of config; track option) {\n \n }\n
    \n `,\n})\nexport class FeedbackEditorComponent extends HotCellEditorAdvancedComponent {\n override config = ['👍', '👎', '🤷'];\n override value = '👍';\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (_editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === this.config.length - 1 ? 0 : index + 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (_editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === 0 ? this.config.length - 1 : index - 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onClick(option: string): void {\n this.setValue(option);\n this.finishEdit.emit();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-feedback',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n { data: 'feedback', width: 100, editor: FeedbackEditorComponent },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotCellEditorAdvancedComponent, KeyboardShortcutConfig, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst inputData = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n selector: 'example1-feedback-editor',\n template: `\n
    \n @for (option of config; track option) {\n \n }\n
    \n `,\n})\nexport class FeedbackEditorComponent extends HotCellEditorAdvancedComponent {\n override config = ['👍', '👎', '🤷'];\n override value = '👍';\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (_editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === this.config.length - 1 ? 0 : index + 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (_editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === 0 ? this.config.length - 1 : index - 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onClick(option: string): void {\n this.setValue(option);\n this.finishEdit.emit();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-feedback',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n { data: 'feedback', width: 100, editor: FeedbackEditorComponent },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.js.json index 0c10550cd..f3ce0eeaa 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n editor: editorFactory({\n config: ['👍', '👎', '🤷'],\n value: '👍',\n shortcuts: [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n\n return false; // Prevent default tabbing behavior\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map((option) => ``)\n .join('');\n },\n init: (editor) => {\n editor.input = document.createElement('DIV');\n editor.input.classList.add('feedback-editor');\n editor._openedAt = 0;\n editor.input.addEventListener('click', (event) => {\n // Ignore synthetic click events that Android fires right after the editor\n // opens — they land on the button that just appeared at the touch position.\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue, cellProperties }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', cellDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n { data: 'feedback', width: 100, type: 'feedback' },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n editor: editorFactory({\n config: ['👍', '👎', '🤷'],\n value: '👍',\n shortcuts: [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n\n return false; // Prevent default tabbing behavior\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map((option) => ``)\n .join('');\n },\n init: (editor) => {\n editor.input = document.createElement('DIV');\n editor.input.classList.add('feedback-editor');\n editor._openedAt = 0;\n editor.input.addEventListener('click', (event) => {\n // Ignore synthetic click events that Android fires right after the editor\n // opens — they land on the button that just appeared at the touch position.\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue, cellProperties }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', cellDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n { data: 'feedback', width: 100, type: 'feedback' },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.ts.json index e0a87ccdb..0ac24e73f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { BaseEditor } from \"handsontable/editors/baseEditor\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { registerCellType } from 'handsontable/cellTypes';\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nconst data = [\n { feature: \"Dark Mode\", category: \"UI\", priority: \"High\", feedback: \"👍\", votes: 124, status: \"Planned\" },\n { feature: \"Bulk Edit\", category: \"Core\", priority: \"High\", feedback: \"👍\", votes: 98, status: \"In Progress\" },\n { feature: \"AI Suggestions\", category: \"Beta\", priority: \"Medium\", feedback: \"🤷\", votes: 45, status: \"Research\" },\n { feature: \"Offline Mode\", category: \"Infra\", priority: \"Low\", feedback: \"👎\", votes: 12, status: \"Backlog\" },\n];\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n editor: editorFactory<\n { input: HTMLDivElement; value: string; config: string[] }\n >({\n config: [\"👍\", \"👎\", \"🤷\"],\n value: \"👍\",\n shortcuts: [\n {\n keys: [[\"ArrowRight\"], [\"Tab\"]],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n return false; // Prevent default tabbing behavior\n },\n },\n {\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map(\n (option) =>\n ``,\n )\n .join(\"\");\n },\n init: (editor) => {\n editor.input = document.createElement(\"DIV\") as HTMLDivElement;\n editor.input.classList.add(\"feedback-editor\");\n editor._openedAt = 0;\n editor.input.addEventListener(\"click\", (event) => {\n // Ignore synthetic click events that Android fires right after the editor\n // opens — they land on the button that just appeared at the touch position.\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue, cellProperties }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', cellDefinition as BaseEditor);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: [\"Feature\", \"Category\", \"Priority\", \"Feedback\", \"Votes\", \"Status\"],\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: \"auto\",\n width: \"100%\",\n headerClassName: \"htLeft\",\n columns: [\n { data: \"feature\", type: \"text\", width: 200 },\n { data: \"category\", type: \"text\", width: 90 },\n { data: \"priority\", type: \"text\", width: 100 },\n { data: \"feedback\", width: 100, type: \"feedback\" },\n { data: \"votes\", type: \"numeric\", width: 60 },\n { data: \"status\", type: \"text\", width: 120 },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { BaseEditor } from \"handsontable/editors/baseEditor\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { registerCellType } from 'handsontable/cellTypes';\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n\nconst data = [\n { feature: \"Dark Mode\", category: \"UI\", priority: \"High\", feedback: \"👍\", votes: 124, status: \"Planned\" },\n { feature: \"Bulk Edit\", category: \"Core\", priority: \"High\", feedback: \"👍\", votes: 98, status: \"In Progress\" },\n { feature: \"AI Suggestions\", category: \"Beta\", priority: \"Medium\", feedback: \"🤷\", votes: 45, status: \"Research\" },\n { feature: \"Offline Mode\", category: \"Infra\", priority: \"Low\", feedback: \"👎\", votes: 12, status: \"Backlog\" },\n];\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n editor: editorFactory<\n { input: HTMLDivElement; value: string; config: string[] }\n >({\n config: [\"👍\", \"👎\", \"🤷\"],\n value: \"👍\",\n shortcuts: [\n {\n keys: [[\"ArrowRight\"], [\"Tab\"]],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n return false; // Prevent default tabbing behavior\n },\n },\n {\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map(\n (option) =>\n ``,\n )\n .join(\"\");\n },\n init: (editor) => {\n editor.input = document.createElement(\"DIV\") as HTMLDivElement;\n editor.input.classList.add(\"feedback-editor\");\n editor._openedAt = 0;\n editor.input.addEventListener(\"click\", (event) => {\n // Ignore synthetic click events that Android fires right after the editor\n // opens — they land on the button that just appeared at the touch position.\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue, cellProperties }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', cellDefinition as BaseEditor);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: [\"Feature\", \"Category\", \"Priority\", \"Feedback\", \"Votes\", \"Status\"],\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: \"auto\",\n width: \"100%\",\n headerClassName: \"htLeft\",\n columns: [\n { data: \"feature\", type: \"text\", width: 200 },\n { data: \"category\", type: \"text\", width: 90 },\n { data: \"priority\", type: \"text\", width: 100 },\n { data: \"feedback\", width: 100, type: \"feedback\" },\n { data: \"votes\", type: \"numeric\", width: 60 },\n { data: \"status\", type: \"text\", width: 120 },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__react__example1.tsx.json index 1c4dcfe13..e79c86317 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__feedback__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n\ninterface FeedbackEditorInstance {\n input: HTMLDivElement;\n value: string;\n config: string[];\n _openedAt: number;\n}\n\nconst feedbackCellDefinition: Pick = {\n editor: editorFactory({\n config: ['👍', '👎', '🤷'],\n value: '👍',\n shortcuts: [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map(\n (option) =>\n ``,\n )\n .join('');\n },\n init: (editor) => {\n editor.input = document.createElement('DIV') as HTMLDivElement;\n editor.input.classList.add('feedback-editor');\n editor._openedAt = 0;\n editor.input.addEventListener('click', (event) => {\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', feedbackCellDefinition);\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Feedback · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n/* end:skip-in-preview */\n\ninterface FeedbackEditorInstance {\n input: HTMLDivElement;\n value: string;\n config: string[];\n _openedAt: number;\n}\n\nconst feedbackCellDefinition: Pick = {\n editor: editorFactory({\n config: ['👍', '👎', '🤷'],\n value: '👍',\n shortcuts: [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === editor.config.length - 1 ? 0 : index + 1;\n editor.setValue(editor.config[index]);\n\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = editor.config.indexOf(editor.value);\n\n index = index === 0 ? editor.config.length - 1 : index - 1;\n editor.setValue(editor.config[index]);\n },\n },\n ],\n render: (editor) => {\n editor.input.innerHTML = editor.config\n .map(\n (option) =>\n ``,\n )\n .join('');\n },\n init: (editor) => {\n editor.input = document.createElement('DIV') as HTMLDivElement;\n editor.input.classList.add('feedback-editor');\n editor._openedAt = 0;\n editor.input.addEventListener('click', (event) => {\n if (Date.now() - editor._openedAt < 300) {\n return;\n }\n if (event.target instanceof HTMLButtonElement) {\n editor.setValue(event.target.innerText);\n editor.finishEditing();\n }\n });\n editor.render(editor);\n },\n afterOpen: (editor) => {\n editor._openedAt = Date.now();\n },\n beforeOpen: (editor, { originalValue }) => {\n editor.setValue(originalValue);\n },\n }),\n};\n\nregisterCellType('feedback', feedbackCellDefinition);\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n display: block;\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/feedback/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Feedback"],"guide":"recipes/cell-types/feedback/feedback.md","guideTitle":"Feedback","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__angular__example1.ts.json index b025710ee..d31410b8e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n GridSettings,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport { format, isDate, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n@Component({\n standalone: true,\n selector: 'example1-flatpickr-editor',\n template: ``,\n styles: [\n `\n :host {\n width: 100%;\n height: 100%;\n }\n .flatpickr-editor {\n width: 100%;\n height: 100%;\n border: none;\n box-sizing: border-box !important;\n padding: 4px 8px;\n }\n `,\n ],\n})\nexport class FlatpickrEditorComponent extends HotCellEditorAdvancedComponent {\n @ViewChild('pickerInput', { static: true }) pickerInput!: ElementRef;\n private fpInstance: ReturnType | null = null;\n\n override afterOpen(): void {\n this.fpInstance = flatpickr(this.pickerInput.nativeElement, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n defaultDate: this.value || undefined,\n onClose: () => {\n this.finishEdit.emit();\n },\n });\n (this.fpInstance as any).open?.();\n }\n\n override afterClose(): void {\n (this.fpInstance as any)?.destroy?.();\n this.fpInstance = null;\n }\n\n override onFocus(): void {\n this.pickerInput.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n selector: 'example1-flatpickr-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ formattedDate }}`,\n})\nexport class FlatpickrRendererComponent extends HotCellRendererAdvancedComponent<\n string,\n { renderFormat: string }\n> {\n get formattedDate(): string {\n if (!this.value) return '';\n\n try {\n const d = parseISO(this.value);\n\n return isDate(d) && isValid(d)\n ? format(d, this.getProps().renderFormat || 'MM/dd/yyyy')\n : this.value;\n } catch {\n return this.value;\n }\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-flatpickr',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Dashboard Pro', version: '3.2.0', releaseDate: '2025-03-15', status: 'Released' },\n { product: 'Form Builder', version: '2.1.0', releaseDate: '2025-04-22', status: 'Released' },\n { product: 'Chart Engine', version: '4.0.0', releaseDate: '2025-06-10', status: 'Beta' },\n { product: 'Auth Module', version: '1.5.2', releaseDate: '2025-07-01', status: 'Released' },\n { product: 'File Manager', version: '2.0.0', releaseDate: '2025-08-18', status: 'Planned' },\n { product: 'Email Service', version: '3.1.0', releaseDate: '2025-09-05', status: 'Released' },\n { product: 'Search Index', version: '1.2.0', releaseDate: '2025-10-12', status: 'Beta' },\n { product: 'Cache Layer', version: '2.3.1', releaseDate: '2025-11-28', status: 'Planned' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n editor: FlatpickrEditorComponent,\n renderer: FlatpickrRendererComponent,\n rendererProps: {\n renderFormat: DATE_FORMAT_EU,\n },\n } as any,\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n editor: FlatpickrEditorComponent,\n renderer: FlatpickrRendererComponent,\n rendererProps: {\n renderFormat: DATE_FORMAT_US,\n },\n } as any,\n { data: 'status', type: 'text', width: 130 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/flatpickr/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n GridSettings,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport { format, isDate, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n@Component({\n standalone: true,\n selector: 'example1-flatpickr-editor',\n template: ``,\n styles: [\n `\n :host {\n width: 100%;\n height: 100%;\n }\n .flatpickr-editor {\n width: 100%;\n height: 100%;\n border: none;\n box-sizing: border-box !important;\n padding: 4px 8px;\n }\n `,\n ],\n})\nexport class FlatpickrEditorComponent extends HotCellEditorAdvancedComponent {\n @ViewChild('pickerInput', { static: true }) pickerInput!: ElementRef;\n private fpInstance: ReturnType | null = null;\n\n override afterOpen(): void {\n this.fpInstance = flatpickr(this.pickerInput.nativeElement, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n defaultDate: this.value || undefined,\n onClose: () => {\n this.finishEdit.emit();\n },\n });\n (this.fpInstance as any).open?.();\n }\n\n override afterClose(): void {\n (this.fpInstance as any)?.destroy?.();\n this.fpInstance = null;\n }\n\n override onFocus(): void {\n this.pickerInput.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n selector: 'example1-flatpickr-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ formattedDate }}`,\n})\nexport class FlatpickrRendererComponent extends HotCellRendererAdvancedComponent<\n string,\n { renderFormat: string }\n> {\n get formattedDate(): string {\n if (!this.value) return '';\n\n try {\n const d = parseISO(this.value);\n\n return isDate(d) && isValid(d)\n ? format(d, this.getProps().renderFormat || 'MM/dd/yyyy')\n : this.value;\n } catch {\n return this.value;\n }\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-flatpickr',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Dashboard Pro', version: '3.2.0', releaseDate: '2025-03-15', status: 'Released' },\n { product: 'Form Builder', version: '2.1.0', releaseDate: '2025-04-22', status: 'Released' },\n { product: 'Chart Engine', version: '4.0.0', releaseDate: '2025-06-10', status: 'Beta' },\n { product: 'Auth Module', version: '1.5.2', releaseDate: '2025-07-01', status: 'Released' },\n { product: 'File Manager', version: '2.0.0', releaseDate: '2025-08-18', status: 'Planned' },\n { product: 'Email Service', version: '3.1.0', releaseDate: '2025-09-05', status: 'Released' },\n { product: 'Search Index', version: '1.2.0', releaseDate: '2025-10-12', status: 'Beta' },\n { product: 'Cache Layer', version: '2.3.1', releaseDate: '2025-11-28', status: 'Planned' },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n editor: FlatpickrEditorComponent,\n renderer: FlatpickrRendererComponent,\n rendererProps: {\n renderFormat: DATE_FORMAT_EU,\n },\n } as any,\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n editor: FlatpickrEditorComponent,\n renderer: FlatpickrRendererComponent,\n rendererProps: {\n renderFormat: DATE_FORMAT_US,\n },\n } as any,\n { data: 'status', type: 'text', width: 130 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/flatpickr/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.js.json index f2c98082d..94c3448c4 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n validator: (value, callback) => {\n callback(!value || isValid(parseISO(value)));\n },\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n }),\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.input.classList.add('flatpickr-editor');\n \n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n /**\n * Prepare dark theme stylesheet for dynamic loading.\n */\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK');\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_EU,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 1,\n },\n },\n },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 0,\n },\n },\n },\n { data: 'status', type: 'text', width: 130 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n validator: (value, callback) => {\n callback(!value || isValid(parseISO(value)));\n },\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n }),\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.input.classList.add('flatpickr-editor');\n \n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n /**\n * Prepare dark theme stylesheet for dynamic loading.\n */\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK');\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_EU,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 1,\n },\n },\n },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 0,\n },\n },\n },\n { data: 'status', type: 'text', width: 130 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.ts.json index 6b570ff9f..0933c1e53 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\ninterface FlatpickrEditorInstance {\n input: HTMLInputElement;\n flatpickr: flatpickr.Instance;\n preventCloseElement: HTMLElement;\n _darkThemeLink: HTMLLinkElement;\n}\n\nconst cellDefinition: Pick<\n CellProperties,\n 'renderer' | 'validator' | 'editor'\n> = {\n validator: (value, callback) => {\n callback(!value || isValid(parseISO(value)));\n },\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n }),\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.classList.add('flatpickr-editor');\n\n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n /**\n * Prepare dark theme stylesheet for dynamic loading.\n */\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK') as HTMLLinkElement;\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key as keyof flatpickr.Options.Options, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_EU,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 1,\n },\n },\n },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 0,\n },\n },\n },\n { data: 'status', type: 'text', width: 130 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\ninterface FlatpickrEditorInstance {\n input: HTMLInputElement;\n flatpickr: flatpickr.Instance;\n preventCloseElement: HTMLElement;\n _darkThemeLink: HTMLLinkElement;\n}\n\nconst cellDefinition: Pick<\n CellProperties,\n 'renderer' | 'validator' | 'editor'\n> = {\n validator: (value, callback) => {\n callback(!value || isValid(parseISO(value)));\n },\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n }),\n editor: editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.classList.add('flatpickr-editor');\n\n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n /**\n * Prepare dark theme stylesheet for dynamic loading.\n */\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK') as HTMLLinkElement;\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key as keyof flatpickr.Options.Options, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Product', 'Version', 'Release (EU)', 'Release (US)', 'Status'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 200 },\n { data: 'version', type: 'text', width: 80 },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_EU,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 1,\n },\n },\n },\n {\n data: 'releaseDate',\n width: 130,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n flatpickrSettings: {\n locale: {\n firstDayOfWeek: 0,\n },\n },\n },\n { data: 'status', type: 'text', width: 130 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__react__example1.tsx.json index 944e2401c..370c4a453 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__flatpickr__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n\ninterface FlatpickrEditorInstance {\n input: HTMLInputElement;\n flatpickr: flatpickr.Instance;\n preventCloseElement: HTMLElement;\n _darkThemeLink: HTMLLinkElement;\n}\n\nconst flatpickrValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(!value || isValid(parseISO(value)));\n};\n\nconst flatpickrRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n});\n\nconst flatpickrEditor = editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.classList.add('flatpickr-editor');\n\n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK') as HTMLLinkElement;\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key as keyof flatpickr.Options.Options, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n});\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Flatpickr · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"date-fns\": \"4.4.0\",\n \"flatpickr\": \"4.6.13\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { format, isValid, parseISO } from 'date-fns';\nimport flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.css';\nimport { CellProperties } from 'handsontable/settings';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n/* start:skip-in-preview */\nconst data = [\n {\n product: 'Dashboard Pro',\n category: 'Analytics',\n version: '3.2.0',\n releaseDate: '2025-03-15',\n status: 'Released',\n downloads: 12450,\n },\n {\n product: 'Form Builder',\n category: 'Tools',\n version: '2.1.0',\n releaseDate: '2025-04-22',\n status: 'Released',\n downloads: 8320,\n },\n {\n product: 'Chart Engine',\n category: 'Analytics',\n version: '4.0.0',\n releaseDate: '2025-06-10',\n status: 'Beta',\n downloads: 3100,\n },\n {\n product: 'Auth Module',\n category: 'Security',\n version: '1.5.2',\n releaseDate: '2025-07-01',\n status: 'Released',\n downloads: 15600,\n },\n {\n product: 'File Manager',\n category: 'Storage',\n version: '2.0.0',\n releaseDate: '2025-08-18',\n status: 'Planned',\n downloads: 0,\n },\n {\n product: 'Email Service',\n category: 'Communication',\n version: '3.1.0',\n releaseDate: '2025-09-05',\n status: 'Released',\n downloads: 9870,\n },\n {\n product: 'Search Index',\n category: 'Tools',\n version: '1.2.0',\n releaseDate: '2025-10-12',\n status: 'Beta',\n downloads: 2450,\n },\n {\n product: 'Cache Layer',\n category: 'Infra',\n version: '2.3.1',\n releaseDate: '2025-11-28',\n status: 'Planned',\n downloads: 0,\n },\n];\n/* end:skip-in-preview */\n\ninterface FlatpickrEditorInstance {\n input: HTMLInputElement;\n flatpickr: flatpickr.Instance;\n preventCloseElement: HTMLElement;\n _darkThemeLink: HTMLLinkElement;\n}\n\nconst flatpickrValidator = (value: string, callback: (valid: boolean) => void) => {\n callback(!value || isValid(parseISO(value)));\n};\n\nconst flatpickrRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const date = parseISO(value);\n\n td.innerText = value && isValid(date) ? format(date, cellProperties.renderFormat) : value || '';\n});\n\nconst flatpickrEditor = editorFactory({\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.input.classList.add('flatpickr-editor');\n\n editor.flatpickr = flatpickr(editor.input, {\n dateFormat: 'Y-m-d',\n disableMobile: true,\n onClose: () => {\n editor.finishEditing();\n },\n });\n\n editor.preventCloseElement = editor.flatpickr.calendarContainer;\n\n editor._darkThemeLink = editor.hot.rootDocument.createElement('LINK') as HTMLLinkElement;\n editor._darkThemeLink.rel = 'stylesheet';\n editor._darkThemeLink.href = 'https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/dark.css';\n },\n afterClose(editor) {\n editor.flatpickr.close();\n },\n afterOpen(editor) {\n const isDark = editor.hot.rootDocument.documentElement.getAttribute('data-theme') === 'dark';\n const head = editor.hot.rootDocument.head;\n\n if (isDark && !editor._darkThemeLink.parentNode) {\n head.appendChild(editor._darkThemeLink);\n } else if (!isDark && editor._darkThemeLink.parentNode) {\n head.removeChild(editor._darkThemeLink);\n }\n\n editor.flatpickr.open();\n },\n beforeOpen(editor, { cellProperties }) {\n for (const key in cellProperties.flatpickrSettings) {\n editor.flatpickr.set(key as keyof flatpickr.Options.Options, cellProperties.flatpickrSettings[key]);\n }\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n editor.flatpickr.setDate(value ? new Date(value) : new Date());\n },\n});\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".flatpickr-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n.flatpickr-editor:focus-visible {\n border: none !important;\n}\n\n.flatpickr-editor.active {\n box-shadow: none;\n background-color: transparent;\n border-radius: 0 !important;\n border-radius: none;\n}"},"docsPath":"recipes/cell-types/flatpickr/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Flatpickr"],"guide":"recipes/cell-types/flatpickr/flatpickr.md","guideTitle":"Flatpickr","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/flatpickr","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-color-picker-angular__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-color-picker-angular__angular__example1.ts.json index 40af30263..f66843f1e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-color-picker-angular__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-color-picker-angular__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule,\n} from '@handsontable/angular-wrapper';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst colorValidator = (value: string): boolean => {\n return /^#[0-9A-Fa-f]{6}$/.test(value);\n};\n\n@Component({\n selector: 'example1-color-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n \n
    `,\n styles: `\n :host {\n height: 100%;\n width: 100%;\n }\n .color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n }\n `,\n standalone: true,\n imports: [],\n})\nexport class ColorRendererComponent extends HotCellRendererAdvancedComponent {}\n\n@Component({\n selector: 'example1-color-picker-editor',\n template: `\n \n `,\n styles: `\n :host {\n height: 100%;\n width: 100%;\n }\n .color-picker-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n cursor: pointer;\n border: none;\n outline: none;\n }\n `,\n standalone: true,\n imports: [],\n})\nexport class ColorPickerEditorComponent extends HotCellEditorAdvancedComponent {\n override afterClose(): void {\n this.finishEdit.emit();\n }\n\n onColorChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.setValue(input.value);\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n columns: [\n {\n data: 'id',\n type: 'numeric',\n width: 80,\n headerClassName: 'htLeft',\n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft',\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n editor: ColorPickerEditorComponent,\n renderer: ColorRendererComponent,\n validator: colorValidator,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/guide-color-picker-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/guide-color-picker-angular/guide-color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker-angular","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Color picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule,\n} from '@handsontable/angular-wrapper';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation Module',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst colorValidator = (value: string): boolean => {\n return /^#[0-9A-Fa-f]{6}$/.test(value);\n};\n\n@Component({\n selector: 'example1-color-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n \n
    `,\n styles: `\n :host {\n height: 100%;\n width: 100%;\n }\n .color-picker-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .color-picker-swatch {\n width: 18px;\n height: 18px;\n border-radius: 50%;\n flex-shrink: 0;\n border: 1px solid rgba(0, 0, 0, 0.15);\n }\n `,\n standalone: true,\n imports: [],\n})\nexport class ColorRendererComponent extends HotCellRendererAdvancedComponent {}\n\n@Component({\n selector: 'example1-color-picker-editor',\n template: `\n \n `,\n styles: `\n :host {\n height: 100%;\n width: 100%;\n }\n .color-picker-editor {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n cursor: pointer;\n border: none;\n outline: none;\n }\n `,\n standalone: true,\n imports: [],\n})\nexport class ColorPickerEditorComponent extends HotCellEditorAdvancedComponent {\n override afterClose(): void {\n this.finishEdit.emit();\n }\n\n onColorChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.setValue(input.value);\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n // eslint-disable-next-line no-mixed-operators\n color: `#${\n // eslint-disable-next-line no-mixed-operators\n Math.round(0x1000000 + 0xffffff * Math.random())\n .toString(16)\n .slice(1)\n .toUpperCase()\n }`,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Item Color', 'Item No.', 'Cost', 'Value in Stock'],\n columns: [\n {\n data: 'id',\n type: 'numeric',\n width: 80,\n headerClassName: 'htLeft',\n },\n {\n data: 'itemName',\n type: 'text',\n width: 200,\n headerClassName: 'htLeft',\n },\n {\n data: 'color',\n headerClassName: 'htLeft',\n editor: ColorPickerEditorComponent,\n renderer: ColorRendererComponent,\n validator: colorValidator,\n },\n {\n data: 'itemNo',\n type: 'text',\n width: 100,\n headerClassName: 'htLeft',\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 70,\n headerClassName: 'htLeft',\n },\n {\n data: 'valueStock',\n type: 'numeric',\n width: 130,\n headerClassName: 'htRight',\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/guide-color-picker-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Color picker"],"guide":"recipes/cell-types/guide-color-picker-angular/guide-color-picker.md","guideTitle":"Color picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/color-picker-angular","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-datepicker-angular__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-datepicker-angular__angular__example1.ts.json index ac9d1c8ec..0ab56d721 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-datepicker-angular__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-datepicker-angular__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Date picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"date-fns\": \"4.4.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject, ViewChild, ElementRef } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule,\n} from '@handsontable/angular-wrapper';\nimport { FormsModule } from '@angular/forms';\nimport { format, parse, isValid } from 'date-fns';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n restockDate: '2025-08-01',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n restockDate: '2025-09-15',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n restockDate: '2025-10-05',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n restockDate: '2025-11-10',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n restockDate: '2025-12-20',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n restockDate: '2026-01-25',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n restockDate: '2026-03-02',\n },\n];\n\n@Component({\n selector: 'example1-date-editor',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n \n `,\n standalone: true,\n imports: [FormsModule],\n})\nexport class DateEditorComponent extends HotCellEditorAdvancedComponent {\n dateValue: string = '';\n\n @ViewChild('editorInput', { static: true })\n protected editorInput!: ElementRef;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n override afterOpen(): void {\n setTimeout(() => {\n this.editorInput.nativeElement.showPicker?.();\n }, 0);\n }\n\n override beforeOpen(_: any, { originalValue }: any) {\n if (originalValue) {\n try {\n let parsedDate: Date;\n\n // Try to parse MM/DD/YYYY format\n if (typeof originalValue === 'string' && originalValue.includes('/')) {\n parsedDate = parse(originalValue, 'MM/dd/yyyy', new Date());\n }\n // Try to parse YYYY-MM-DD format\n else if (typeof originalValue === 'string' && originalValue.includes('-')) {\n parsedDate = parse(originalValue, 'yyyy-MM-dd', new Date());\n }\n // Fallback to generic date parsing\n else {\n parsedDate = new Date(originalValue);\n }\n\n if (isValid(parsedDate)) {\n // Format as YYYY-MM-DD for native input type='date'\n this.dateValue = format(parsedDate, 'yyyy-MM-dd');\n } else {\n this.dateValue = '';\n }\n } catch (error) {\n console.error('Error parsing date:', error);\n this.dateValue = '';\n }\n } else {\n this.dateValue = '';\n }\n\n this.cdr.detectChanges();\n }\n\n override afterClose(): void {\n this.finishEdit.emit();\n }\n\n onDateChange(): void {\n if (this.dateValue) {\n try {\n // Parse YYYY-MM-DD from input\n const parsedDate = parse(this.dateValue, 'yyyy-MM-dd', new Date());\n\n if (isValid(parsedDate)) {\n // Format as MM/DD/YYYY for Handsontable\n const formattedDate = format(parsedDate, 'MM/dd/yyyy');\n this.setValue(formattedDate);\n }\n } catch (error) {\n console.error('Error formatting date:', error);\n }\n }\n }\n\n override onFocus(): void {\n this.editorInput.nativeElement.focus();\n }\n}\n\n@Component({\n selector: 'example1-date-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `
    \n {{ formattedDate }}\n
    `,\n standalone: true,\n imports: [],\n})\nexport class DateRendererComponent extends HotCellRendererAdvancedComponent {\n get formattedDate(): string {\n return format(new Date(this.value), this.getProps().renderFormat);\n }\n}\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n@Component({\n selector: 'example1-guide-datepicker-angular',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n stars: Math.floor(Math.random() * 5) + 1,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Restock Date EU', 'Restock Date US'],\n columns: [\n { data: 'id', type: 'numeric' },\n {\n data: 'itemName',\n type: 'text',\n },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n rendererProps: {\n renderFormat: DATE_FORMAT_EU,\n },\n editor: DateEditorComponent,\n renderer: DateRendererComponent,\n },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n rendererProps: {\n renderFormat: DATE_FORMAT_US,\n },\n editor: DateEditorComponent,\n renderer: DateRendererComponent,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/guide-datepicker-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Date picker"],"guide":"recipes/cell-types/guide-datepicker-angular/guide-datepicker.md","guideTitle":"Date picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/datepicker","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Date picker · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"date-fns\": \"4.4.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject, ViewChild, ElementRef } from '@angular/core';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n HotTableModule,\n} from '@handsontable/angular-wrapper';\nimport { FormsModule } from '@angular/forms';\nimport { format, parse, isValid } from 'date-fns';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n restockDate: '2025-08-01',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n restockDate: '2025-09-15',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n restockDate: '2025-10-05',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n restockDate: '2025-11-10',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n restockDate: '2025-12-20',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n restockDate: '2026-01-25',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n restockDate: '2026-03-02',\n },\n];\n\n@Component({\n selector: 'example1-date-editor',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n \n `,\n standalone: true,\n imports: [FormsModule],\n})\nexport class DateEditorComponent extends HotCellEditorAdvancedComponent {\n dateValue: string = '';\n\n @ViewChild('editorInput', { static: true })\n protected editorInput!: ElementRef;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n override afterOpen(): void {\n setTimeout(() => {\n this.editorInput.nativeElement.showPicker?.();\n }, 0);\n }\n\n override beforeOpen(_: any, { originalValue }: any) {\n if (originalValue) {\n try {\n let parsedDate: Date;\n\n // Try to parse MM/DD/YYYY format\n if (typeof originalValue === 'string' && originalValue.includes('/')) {\n parsedDate = parse(originalValue, 'MM/dd/yyyy', new Date());\n }\n // Try to parse YYYY-MM-DD format\n else if (typeof originalValue === 'string' && originalValue.includes('-')) {\n parsedDate = parse(originalValue, 'yyyy-MM-dd', new Date());\n }\n // Fallback to generic date parsing\n else {\n parsedDate = new Date(originalValue);\n }\n\n if (isValid(parsedDate)) {\n // Format as YYYY-MM-DD for native input type='date'\n this.dateValue = format(parsedDate, 'yyyy-MM-dd');\n } else {\n this.dateValue = '';\n }\n } catch (error) {\n console.error('Error parsing date:', error);\n this.dateValue = '';\n }\n } else {\n this.dateValue = '';\n }\n\n this.cdr.detectChanges();\n }\n\n override afterClose(): void {\n this.finishEdit.emit();\n }\n\n onDateChange(): void {\n if (this.dateValue) {\n try {\n // Parse YYYY-MM-DD from input\n const parsedDate = parse(this.dateValue, 'yyyy-MM-dd', new Date());\n\n if (isValid(parsedDate)) {\n // Format as MM/DD/YYYY for Handsontable\n const formattedDate = format(parsedDate, 'MM/dd/yyyy');\n this.setValue(formattedDate);\n }\n } catch (error) {\n console.error('Error formatting date:', error);\n }\n }\n }\n\n override onFocus(): void {\n this.editorInput.nativeElement.focus();\n }\n}\n\n@Component({\n selector: 'example1-date-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `
    \n {{ formattedDate }}\n
    `,\n standalone: true,\n imports: [],\n})\nexport class DateRendererComponent extends HotCellRendererAdvancedComponent {\n get formattedDate(): string {\n return format(new Date(this.value), this.getProps().renderFormat);\n }\n}\n\nconst DATE_FORMAT_US = 'MM/dd/yyyy';\nconst DATE_FORMAT_EU = 'dd/MM/yyyy';\n\n@Component({\n selector: 'example1-guide-datepicker-angular',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n stars: Math.floor(Math.random() * 5) + 1,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Restock Date EU', 'Restock Date US'],\n columns: [\n { data: 'id', type: 'numeric' },\n {\n data: 'itemName',\n type: 'text',\n },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n rendererProps: {\n renderFormat: DATE_FORMAT_EU,\n },\n editor: DateEditorComponent,\n renderer: DateRendererComponent,\n },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n rendererProps: {\n renderFormat: DATE_FORMAT_US,\n },\n editor: DateEditorComponent,\n renderer: DateRendererComponent,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/guide-datepicker-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Date picker"],"guide":"recipes/cell-types/guide-datepicker-angular/guide-datepicker.md","guideTitle":"Date picker","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/datepicker","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-feedback-angular__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-feedback-angular__angular__example1.ts.json index 88dc6b70a..74053b496 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-feedback-angular__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-feedback-angular__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Feedback Editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotCellEditorAdvancedComponent, HotTableModule, KeyboardShortcutConfig } from '@handsontable/angular-wrapper';\n\nexport const inputData = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n\n@Component({\n selector: 'example1-feedback-angular',\n standalone: true,\n imports: [],\n template: `\n
    \n @for (option of config; track option) {\n \n }\n
    \n `,\n})\nexport class FeedbackEditorComponent extends HotCellEditorAdvancedComponent {\n override config = ['👍', '👎', '🤷'];\n override value = '👍';\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === this.config.length - 1 ? 0 : index + 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === 0 ? this.config.length - 1 : index - 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onClick(option: string): void {\n this.setValue(option);\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n {\n data: 'feedback',\n width: 100,\n editor: FeedbackEditorComponent,\n config: ['👍', '👎', '🤷'],\n },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/guide-feedback-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback Editor"],"guide":"recipes/cell-types/guide-feedback-angular/guide-feedback.md","guideTitle":"Feedback Editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback-angular","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Feedback Editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotCellEditorAdvancedComponent, HotTableModule, KeyboardShortcutConfig } from '@handsontable/angular-wrapper';\n\nexport const inputData = [\n { feature: 'Dark Mode', category: 'UI', priority: 'High', feedback: '👍', votes: 124, status: 'Planned' },\n { feature: 'Bulk Edit', category: 'Core', priority: 'High', feedback: '👍', votes: 98, status: 'In Progress' },\n { feature: 'AI Suggestions', category: 'Beta', priority: 'Medium', feedback: '🤷', votes: 45, status: 'Research' },\n { feature: 'Offline Mode', category: 'Infra', priority: 'Low', feedback: '👎', votes: 12, status: 'Backlog' },\n];\n\n@Component({\n selector: 'example1-feedback-angular',\n standalone: true,\n imports: [],\n template: `\n
    \n @for (option of config; track option) {\n \n }\n
    \n `,\n})\nexport class FeedbackEditorComponent extends HotCellEditorAdvancedComponent {\n override config = ['👍', '👎', '🤷'];\n override value = '👍';\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['ArrowRight'], ['Tab']],\n callback: (editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === this.config.length - 1 ? 0 : index + 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n\n return false;\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n let index = this.config.indexOf(this.getValue());\n\n index = index === 0 ? this.config.length - 1 : index - 1;\n this.setValue(this.config[index]);\n this.cdr.detectChanges();\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onClick(option: string): void {\n this.setValue(option);\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Feature', 'Category', 'Priority', 'Feedback', 'Votes', 'Status'],\n columns: [\n { data: 'feature', type: 'text', width: 200 },\n { data: 'category', type: 'text', width: 90 },\n { data: 'priority', type: 'text', width: 100 },\n {\n data: 'feedback',\n width: 100,\n editor: FeedbackEditorComponent,\n config: ['👍', '👎', '🤷'],\n },\n { data: 'votes', type: 'numeric', width: 60 },\n { data: 'status', type: 'text', width: 120 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".feedback-editor {\n display: flex;\n gap: var(--ht-gap, 4px);\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n border: none;\n border-radius: 0;\n}\n\n.feedback-editor button {\n background: var(--ht-background-color, #ffffff);\n color: var(--ht-foreground-color, #000000);\n border: 1px solid var(--ht-border-color, #e0e0e0);\n border-radius: var(--ht-border-radius, 4px);\n padding: 0;\n margin: 0;\n height: 100%;\n width: 33%;\n font-size: var(--ht-font-size, 14px);\n text-align: center;\n cursor: pointer;\n}\n\n.feedback-editor button:hover {\n background: var(--ht-border-color, #e0e0e0);\n}\n\n.feedback-editor button.active,\n.feedback-editor button.active:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: #ffffff;\n border-color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/guide-feedback-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Feedback Editor"],"guide":"recipes/cell-types/guide-feedback-angular/guide-feedback.md","guideTitle":"Feedback Editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/feedback-angular","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-rating-angular__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-rating-angular__angular__example1.ts.json index fde305a30..5c5aedfe6 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-rating-angular__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__guide-rating-angular__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Star Rating Editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotTableModule,\n KeyboardShortcutConfig,\n HotCellRendererAdvancedComponent,\n} from '@handsontable/angular-wrapper';\n\nexport const starSvg =\n '';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n },\n];\n\n@Component({\n selector: 'example1-guide-star-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    `,\n standalone: true,\n imports: [],\n})\nexport class StarRendererComponent extends HotCellRendererAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n}\n\n@Component({\n selector: 'example1-guide-star-editor',\n standalone: true,\n imports: [],\n template: `\n \n @for (star of stars; track $index) {\n \n }\n
    \n `,\n})\nexport class StarEditorComponent extends HotCellEditorAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n\n isCurrentStar(index: number): boolean {\n return (index + 1) === parseInt(this.getValue()?.toString() ?? '0', 10);\n }\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue(_event.key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onMouseOver(event: MouseEvent): void {\n const star = (event.target as HTMLElement).closest('.rating-star') as HTMLElement | null;\n if (\n star?.dataset['value'] &&\n parseInt(this.getValue()?.toString() ?? '0', 10) !== parseInt(star.dataset['value'], 10)\n ) {\n this.setValue(parseInt(star.dataset['value'], 10));\n }\n this.cdr.detectChanges();\n }\n\n onMouseDown(): void {\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n stars: Math.floor(Math.random() * 5) + 1,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Stars Rating'],\n columns: [\n { data: 'id', type: 'numeric' },\n {\n data: 'itemName',\n type: 'text',\n },\n {\n data: 'stars',\n width: 200,\n renderer: StarRendererComponent,\n editor: StarEditorComponent,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0);\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/guide-rating-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating Editor"],"guide":"recipes/cell-types/guide-rating-angular/guide-rating.md","guideTitle":"Star Rating Editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating-angular","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Star Rating Editor · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotTableModule,\n KeyboardShortcutConfig,\n HotCellRendererAdvancedComponent,\n} from '@handsontable/angular-wrapper';\n\nexport const starSvg =\n '';\n\nexport const inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n },\n];\n\n@Component({\n selector: 'example1-guide-star-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    `,\n standalone: true,\n imports: [],\n})\nexport class StarRendererComponent extends HotCellRendererAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n}\n\n@Component({\n selector: 'example1-guide-star-editor',\n standalone: true,\n imports: [],\n template: `\n \n @for (star of stars; track $index) {\n \n }\n
    \n `,\n})\nexport class StarEditorComponent extends HotCellEditorAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n\n isCurrentStar(index: number): boolean {\n return (index + 1) === parseInt(this.getValue()?.toString() ?? '0', 10);\n }\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue(_event.key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ];\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n onMouseOver(event: MouseEvent): void {\n const star = (event.target as HTMLElement).closest('.rating-star') as HTMLElement | null;\n if (\n star?.dataset['value'] &&\n parseInt(this.getValue()?.toString() ?? '0', 10) !== parseInt(star.dataset['value'], 10)\n ) {\n this.setValue(parseInt(star.dataset['value'], 10));\n }\n this.cdr.detectChanges();\n }\n\n onMouseDown(): void {\n this.finishEdit.emit();\n }\n}\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = inputData.map((el) => ({\n ...el,\n stars: Math.floor(Math.random() * 5) + 1,\n }));\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n manualColumnResize: true,\n manualRowResize: true,\n colHeaders: ['ID', 'Item Name', 'Stars Rating'],\n columns: [\n { data: 'id', type: 'numeric' },\n {\n data: 'itemName',\n type: 'text',\n },\n {\n data: 'stars',\n width: 200,\n renderer: StarRendererComponent,\n editor: StarEditorComponent,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: {\n license: NON_COMMERCIAL_LICENSE,\n } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0);\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/guide-rating-angular/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating Editor"],"guide":"recipes/cell-types/guide-rating-angular/guide-rating.md","guideTitle":"Star Rating Editor","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating-angular","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__angular__example1.ts.json index b3ae8cd58..724dea7e7 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-moment-date',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n restockDate: '2025-08-01',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n restockDate: '2025-09-15',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n restockDate: '2025-10-05',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n restockDate: '2025-11-10',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n restockDate: '2025-12-20',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n restockDate: '2026-01-25',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n beforeChange: correctDatesBeforeChange,\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/moment-date/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-moment-date',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n restockDate: '2025-08-01',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n restockDate: '2025-09-15',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n restockDate: '2025-10-05',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n restockDate: '2025-11-10',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n restockDate: '2025-12-20',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n restockDate: '2026-01-25',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n beforeChange: correctDatesBeforeChange,\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/moment-date/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.js.json index 1790a1989..3d776d4df 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n// Register all Handsontable's modules.\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n// Converts a loosely written date into ISO.\nconst toISODate = (value, inputFormat) => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value, cellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n const date = moment(value, ISO_FORMAT, true);\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(changes) {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop);\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n const cellMeta = this.getCellMetaTransient(visualRow, column);\n if (cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === '') {\n return;\n }\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\nregisterCellType('moment-date', cellDateTypeDefinition);\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n beforeChange: correctDatesBeforeChange,\n};\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/moment-date/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n// Register all Handsontable's modules.\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n// Converts a loosely written date into ISO.\nconst toISODate = (value, inputFormat) => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value, cellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n const date = moment(value, ISO_FORMAT, true);\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(changes) {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop);\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n const cellMeta = this.getCellMetaTransient(visualRow, column);\n if (cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === '') {\n return;\n }\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\nregisterCellType('moment-date', cellDateTypeDefinition);\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n beforeChange: correctDatesBeforeChange,\n};\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/moment-date/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.ts.json index 7ffda1917..5d1e003ec 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n beforeChange: correctDatesBeforeChange,\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/moment-date/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n type: 'moment-date',\n width: 150,\n // Display format, applied by `valueFormatter`. The stored value stays ISO.\n renderFormat: 'MMM D, YYYY',\n // Format tried first when correcting a pasted value.\n inputFormat: 'MM/DD/YYYY',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n beforeChange: correctDatesBeforeChange,\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/moment-date/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__react__example1.tsx.json index ffae2813b..de65a1e25 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-date__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\nregisterAllModules();\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/moment-date/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based date · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerCellType, DateCellType } from 'handsontable/cellTypes';\nimport { CellChange, CellProperties } from 'handsontable/settings';\nimport { HotInstance } from 'handsontable';\nimport moment from 'moment';\n\nregisterAllModules();\n\n// The built-in `date` cell type stores every value in the ISO 8601 format.\nconst ISO_FORMAT = 'YYYY-MM-DD';\n\n// Converts a loosely written date into ISO.\nconst toISODate = (value: string, inputFormat: string): string => {\n // The column's own format wins, parsed strictly so a near-miss does not silently shift.\n const fromInputFormat = moment(value, inputFormat, true);\n\n if (fromInputFormat.isValid()) {\n return fromInputFormat.format(ISO_FORMAT);\n }\n\n // Fall back to the browser's parsing for values that format cannot describe, such as\n // \"March 14, 2025\". Handing Moment a Date avoids its string-parsing deprecation warning.\n const nativeDate = new Date(value);\n\n return Number.isNaN(nativeDate.getTime()) ? value : moment(nativeDate).format(ISO_FORMAT);\n};\n\n// The custom cell properties this cell type reads, on top of the built-in ones.\ntype MomentDateCellProperties = CellProperties & {\n renderFormat?: string;\n inputFormat?: string;\n correctFormat?: boolean;\n};\n\nconst cellDateTypeDefinition = {\n // Inherit the built-in date editor (a native date input), its ISO validator, and the source-data\n // check that warns when the underlying data is not ISO.\n ...DateCellType,\n\n // Display the ISO source value in the column's own Moment format. `valueFormatter` runs before the\n // renderer, so the inherited renderer receives the formatted string and no custom renderer is needed.\n valueFormatter: (value: unknown, cellProperties: MomentDateCellProperties) => {\n if (typeof value !== 'string' || value === '') {\n return value;\n }\n\n const date = moment(value, ISO_FORMAT, true);\n\n return date.isValid() ? date.format(cellProperties.renderFormat ?? ISO_FORMAT) : value;\n },\n};\n\n// Rewrites a non-ISO value into ISO before it reaches the cell. This runs ahead of both the editor\n// and the validator, which is what keeps the built-in ISO-only editor from warning about the raw\n// value. It also covers pasted and programmatically written values, which never touch the editor.\nfunction correctDatesBeforeChange(this: HotInstance, changes: (CellChange | null)[]): void {\n changes.forEach((change) => {\n if (!change) {\n return;\n }\n\n const [visualRow, prop, , newValue] = change;\n const column = this.propToCol(prop as string);\n\n // Skip a property that names no column.\n if (column === null) {\n return;\n }\n\n const cellMeta = this.getCellMetaTransient(visualRow, column) as MomentDateCellProperties;\n\n if (\n cellMeta.type !== 'moment-date' ||\n cellMeta.correctFormat !== true ||\n typeof newValue !== 'string' ||\n newValue === ''\n ) {\n return;\n }\n\n if (!moment(newValue, ISO_FORMAT, true).isValid()) {\n change[3] = toISODate(newValue, cellMeta.inputFormat ?? ISO_FORMAT);\n }\n });\n}\n\nregisterCellType('moment-date', cellDateTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/moment-date/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Moment.js-based date"],"guide":"recipes/cell-types/moment-date/moment-date.md","guideTitle":"Moment.js-based date","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-date","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__angular__example1.ts.json index fcb19b9a7..6e422020f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport moment from 'moment';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nconst cellTimeTypeDefinition = {\n CELL_TYPE: 'moment-time',\n renderer: getRenderer('text'),\n validator(this: any, value: any, callback: (valid: boolean) => void): void {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(\n value,\n ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', 'x'],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-moment-time',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n time: '09:30',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n time: '14:15',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n time: '08:00',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n time: '16:45',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n time: '11:20',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n time: '23:00',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time' as any,\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n } as any,\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/moment-time/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport moment from 'moment';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nconst cellTimeTypeDefinition = {\n CELL_TYPE: 'moment-time',\n renderer: getRenderer('text'),\n validator(this: any, value: any, callback: (valid: boolean) => void): void {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(\n value,\n ['YYYY-MM-DDTHH:mm:ss.SSSZ', 'X', 'x'],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-moment-time',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n time: '09:30',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n time: '14:15',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n time: '08:00',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n time: '16:45',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n time: '11:20',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n time: '23:00',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time' as any,\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n } as any,\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/moment-time/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.js.json index 6afa541ee..26074eaea 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator(value, callback) {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(\n value,\n [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X',\n 'x', // Unix ms timestamp\n ],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n // is it in the specified format\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time',\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/moment-time/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator(value, callback) {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(\n value,\n [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X',\n 'x', // Unix ms timestamp\n ],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n // is it in the specified format\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time',\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/moment-time/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.ts.json index 9d238bd96..28f5ea0fa 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator: function(value, callback) {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(value, [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X', // Unix timestamp\n 'x' // Unix ms timestamp\n ], true).isValid() ?\n moment(value) : moment(value, timeFormat);\n let isValidTime = date.isValid();\n\n // is it in the specified format\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n if (!isValidTime) {\n valid = false;\n }\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time',\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/moment-time/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator: function(value, callback) {\n const timeFormat = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(value) ? parseInt(value, 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(value);\n\n if (twoDigitValue) {\n value += ':00';\n }\n\n const date = moment(value, [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X', // Unix timestamp\n 'x' // Unix ms timestamp\n ], true).isValid() ?\n moment(value) : moment(value, timeFormat);\n let isValidTime = date.isValid();\n\n // is it in the specified format\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n if (!isValidTime) {\n valid = false;\n }\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Arrival Time', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'time',\n type: 'moment-time',\n width: 150,\n timeFormat: 'HH:mm',\n correctFormat: true,\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/moment-time/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__react__example1.tsx.json index f599d3b8d..3ef01eff9 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__moment-time__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\nregisterAllModules();\n\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator(this: any, value: string | number, callback: (valid: boolean) => void) {\n const timeFormat: string = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(String(value)) ? parseInt(String(value), 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(String(value));\n\n if (twoDigitValue) {\n value = `${value}:00`;\n }\n\n const date = moment(\n value,\n [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X',\n 'x',\n ],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n time: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/moment-time/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Moment.js-based time · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport moment from 'moment';\n\nregisterAllModules();\n\nconst cellTimeTypeDefinition = {\n renderer: getRenderer('text'),\n validator(this: any, value: string | number, callback: (valid: boolean) => void) {\n const timeFormat: string = this.timeFormat ?? 'h:mm:ss a';\n let valid = true;\n\n if (value === null) {\n value = '';\n }\n\n value = /^\\d{3,}$/.test(String(value)) ? parseInt(String(value), 10) : value;\n\n const twoDigitValue = /^\\d{1,2}$/.test(String(value));\n\n if (twoDigitValue) {\n value = `${value}:00`;\n }\n\n const date = moment(\n value,\n [\n 'YYYY-MM-DDTHH:mm:ss.SSSZ',\n 'X',\n 'x',\n ],\n true\n ).isValid()\n ? moment(value)\n : moment(value, timeFormat);\n\n let isValidTime = date.isValid();\n let isValidFormat = moment(value, timeFormat, true).isValid() && !twoDigitValue;\n\n if (this.allowEmpty && value === '') {\n isValidTime = true;\n isValidFormat = true;\n }\n\n if (!isValidTime) {\n valid = false;\n }\n\n if (!isValidTime && isValidFormat) {\n valid = true;\n }\n\n if (isValidTime && !isValidFormat) {\n if (this.correctFormat === true) {\n const correctedValue = date.format(timeFormat);\n\n this.instance.setDataAtCell(this.visualRow, this.visualCol, correctedValue, 'timeValidator');\n valid = true;\n } else {\n valid = false;\n }\n }\n\n callback(valid);\n },\n editor: getEditor('text'),\n};\n\nregisterCellType('moment-time', cellTimeTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n time: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n time: '09:30',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n time: '14:15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n time: '08:00',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n time: '16:45',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n time: '11:20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n time: '23:00',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/moment-time/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Moment.js-based time"],"guide":"recipes/cell-types/moment-time/moment-time.md","guideTitle":"Moment.js-based time","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/moment-time","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__angular__example1.ts.json index 19f226938..77c4e5173 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"numbro\": \"2.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register the modules here, not in app.config.ts: this file reaches for the built-in\n// numeric editor and validator while its own module body runs, which is before any\n// later import has been evaluated.\nregisterAllModules();\n\nObject.values(languages).forEach((language: any) => numbro.registerLanguage(language));\n\nfunction isNumeric(value: any): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(\n `^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`,\n 'i'\n ).test(value.trim());\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\nconst cellTypeDefinition = {\n CELL_TYPE: 'numbro',\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }: any) => {\n if (isNumeric(value)) {\n let classArr: string[] = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = (numbro as any).allLanguages\n ? (numbro as any).allLanguages[cellCulture]\n : (numbro as any)[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-numbro',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n quantity: 2,\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n quantity: 0,\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n quantity: 50,\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n quantity: 10,\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n quantity: 0,\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n quantity: 3,\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro' as any,\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n } as any,\n {\n data: 'cost',\n type: 'numbro' as any,\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n } as any,\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/numbro/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"numbro\": \"2.5.0\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register the modules here, not in app.config.ts: this file reaches for the built-in\n// numeric editor and validator while its own module body runs, which is before any\n// later import has been evaluated.\nregisterAllModules();\n\nObject.values(languages).forEach((language: any) => numbro.registerLanguage(language));\n\nfunction isNumeric(value: any): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(\n `^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`,\n 'i'\n ).test(value.trim());\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\nconst cellTypeDefinition = {\n CELL_TYPE: 'numbro',\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }: any) => {\n if (isNumeric(value)) {\n let classArr: string[] = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = (numbro as any).allLanguages\n ? (numbro as any).allLanguages[cellCulture]\n : (numbro as any)[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-numbro',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n quantity: 2,\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n quantity: 0,\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n quantity: 50,\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n quantity: 10,\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n quantity: 0,\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n quantity: 3,\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro' as any,\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n } as any,\n {\n data: 'cost',\n type: 'numbro' as any,\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n } as any,\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/cell-types/numbro/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.js.json index 34c3a3330..cee56ee9b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\nimport languages from 'numbro/dist/languages.min.js';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nObject.values(languages).forEach((language) => numbro.registerLanguage(language));\n\nfunction isNumeric(value) {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i').test(\n value.trim()\n );\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n // Register the language if it's not already registered\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = numbro.allLanguages ? numbro.allLanguages[cellCulture] : numbro[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro',\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n },\n {\n data: 'cost',\n type: 'numbro',\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/numbro/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\nimport languages from 'numbro/dist/languages.min.js';\n\n// Register all Handsontable's modules.\nregisterAllModules();\nObject.values(languages).forEach((language) => numbro.registerLanguage(language));\n\nfunction isNumeric(value) {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i').test(\n value.trim()\n );\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n // Register the language if it's not already registered\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = numbro.allLanguages ? numbro.allLanguages[cellCulture] : numbro[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro',\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n },\n {\n data: 'cost',\n type: 'numbro',\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/cell-types/numbro/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.ts.json index cb8b054a1..0fb1335d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nObject.values(languages).forEach((language) => numbro.registerLanguage(language));\n\nfunction isNumeric(value: any): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map(d => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i')\n .test(value.trim());\n\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = numericFormat && numericFormat.culture || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n // Register the language if it's not already registered\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = numbro.allLanguages ? numbro.allLanguages[cellCulture] : numbro[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro',\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n },\n {\n data: 'cost',\n type: 'numbro',\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/numbro/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nObject.values(languages).forEach((language) => numbro.registerLanguage(language));\n\nfunction isNumeric(value: any): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value) && isFinite(value);\n\n } else if (type === 'string') {\n if (value.length === 0) {\n return false;\n\n } else if (value.length === 1) {\n return /\\d/.test(value);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map(d => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i')\n .test(value.trim());\n\n } else if (type === 'object') {\n return !!value && typeof value.valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\n/* start:skip-in-preview */\nconst data = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className;\n } else {\n const className = cellProperties.className ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat;\n const cellCulture = numericFormat && numericFormat.culture || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n // Register the language if it's not already registered\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = numbro.allLanguages ? numbro.allLanguages[cellCulture] : numbro[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n\n value = numbro(value).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Quantity', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'quantity',\n type: 'numbro',\n width: 150,\n className: 'htRight',\n numericFormat: {\n pattern: '0,0',\n culture: 'en-US',\n },\n },\n {\n data: 'cost',\n type: 'numbro',\n width: 120,\n className: 'htRight',\n numericFormat: {\n pattern: '$0,0.00',\n culture: 'en-US',\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/cell-types/numbro/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__react__example1.tsx.json index 19f113197..60ea81e52 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__numbro__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\n\nregisterAllModules();\nObject.values(languages).forEach((language) => numbro.registerLanguage(language as numbro.NumbroLanguage));\n\nfunction isNumeric(value: unknown): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value as number) && isFinite(value as number);\n } else if (type === 'string') {\n const str = value as string;\n\n if (str.length === 0) {\n return false;\n } else if (str.length === 1) {\n return /\\d/.test(str);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i').test(\n str.trim()\n );\n } else if (type === 'object') {\n return !!value && typeof (value as object).valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr: string[] = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className as string[];\n } else {\n const className = (cellProperties.className as string) ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat as { culture?: string; pattern?: string } | undefined;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = (numbro as any).allLanguages ? (numbro as any).allLanguages[cellCulture] : (numbro as any)[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value as number).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/numbro/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Numbro · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"numbro\": \"2.5.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory, getRenderer } from 'handsontable/renderers';\nimport { getEditor } from 'handsontable/editors';\nimport { getValidator } from 'handsontable/validators';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport numbro from 'numbro';\n// numbro ships no type declarations for its bundled language pack.\n// @ts-expect-error -- untyped module\nimport languages from 'numbro/dist/languages.min.js';\n\nregisterAllModules();\nObject.values(languages).forEach((language) => numbro.registerLanguage(language as numbro.NumbroLanguage));\n\nfunction isNumeric(value: unknown): boolean {\n const type = typeof value;\n\n if (type === 'number') {\n return !isNaN(value as number) && isFinite(value as number);\n } else if (type === 'string') {\n const str = value as string;\n\n if (str.length === 0) {\n return false;\n } else if (str.length === 1) {\n return /\\d/.test(str);\n }\n\n const delimiter = Array.from(new Set(['.']))\n .map((d) => `\\\\${d}`)\n .join('|');\n\n return new RegExp(`^[+-]?(((${delimiter})?\\\\d+((${delimiter})\\\\d+)?(e[+-]?\\\\d+)?)|(0x[a-f\\\\d]+))$`, 'i').test(\n str.trim()\n );\n } else if (type === 'object') {\n return !!value && typeof (value as object).valueOf() === 'number' && !(value instanceof Date);\n }\n\n return false;\n}\n\nconst cellTypeDefinition = {\n renderer: rendererFactory(({ hotInstance, td, row, col, prop, value, cellProperties }) => {\n if (isNumeric(value)) {\n let classArr: string[] = [];\n\n if (Array.isArray(cellProperties.className)) {\n classArr = cellProperties.className as string[];\n } else {\n const className = (cellProperties.className as string) ?? '';\n\n if (className.length) {\n classArr = className.split(' ');\n }\n }\n\n const numericFormat = cellProperties.numericFormat as { culture?: string; pattern?: string } | undefined;\n const cellCulture = (numericFormat && numericFormat.culture) || 'en-US';\n const cellFormatPattern = numericFormat && numericFormat.pattern;\n\n if (cellCulture && !numbro.languages()[cellCulture]) {\n const shortTag = cellCulture.replace('-', '');\n const langData = (numbro as any).allLanguages ? (numbro as any).allLanguages[cellCulture] : (numbro as any)[shortTag];\n\n if (langData) {\n numbro.registerLanguage(langData);\n }\n }\n\n numbro.setLanguage(cellCulture);\n value = numbro(value as number).format(cellFormatPattern ?? '0');\n\n if (\n classArr.indexOf('htLeft') < 0 &&\n classArr.indexOf('htCenter') < 0 &&\n classArr.indexOf('htRight') < 0 &&\n classArr.indexOf('htJustify') < 0\n ) {\n classArr.push('htRight');\n }\n\n if (classArr.indexOf('htNumeric') < 0) {\n classArr.push('htNumeric');\n }\n\n cellProperties.className = classArr.join(' ');\n td.dir = 'ltr';\n }\n\n getRenderer('text')(hotInstance, td, row, col, prop, value, cellProperties);\n }),\n validator: getValidator('numeric'),\n editor: getEditor('numeric'),\n};\n\nregisterCellType('numbro', cellTypeDefinition);\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst data: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/cell-types/numbro/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Numbro"],"guide":"recipes/cell-types/numbro/numbro.md","guideTitle":"Numbro","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/numbro","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__angular__example1.ts.json index 80d1df3ce..595907163 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\",\n \"@types/pikaday\": \"1.7.10\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n GridSettings,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport './example1.css';\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\n\n@Component({\n standalone: true,\n selector: 'example1-pikaday-editor',\n template: `
    `,\n styles: [\n `\n :host { display: block; }\n .pikaday-container { width: 278px; }\n `,\n ],\n})\nexport class PikadayEditorComponent extends HotCellEditorAdvancedComponent {\n override position = 'portal' as const;\n @ViewChild('container', { static: true }) container!: ElementRef;\n private pikaday: Pikaday | null = null;\n\n override afterOpen(): void {\n const FORMAT = DATE_FORMAT_US;\n\n this.pikaday = new Pikaday({\n field: this.container.nativeElement,\n container: this.container.nativeElement,\n bound: false,\n format: FORMAT,\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n toString: (date: Date, format?: string) => moment(date).format(format),\n parse: (dateString: string, format: string) => moment(dateString, format).toDate(),\n onSelect: (date: Date) => {\n this.setValue(moment(date).format(FORMAT));\n },\n onClose: () => {\n this.finishEdit.emit();\n },\n });\n\n if (this.value) {\n const m = moment(this.value, FORMAT, true);\n\n if (m.isValid()) {\n this.pikaday.setDate(m.toDate(), true);\n }\n }\n\n this.pikaday.show();\n }\n\n override afterClose(): void {\n this.pikaday?.destroy();\n this.pikaday = null;\n }\n\n override onFocus(): void {\n this.container.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n selector: 'example1-pikaday-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ formattedDate }}`,\n})\nexport class PikadayRendererComponent extends HotCellRendererAdvancedComponent {\n get formattedDate(): string {\n if (!this.value) return '';\n const m = moment(this.value, DATE_FORMAT_US, true);\n\n return m.isValid() ? m.format(DATE_FORMAT_US) : this.value;\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-pikaday',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n restockDate: '08/01/2025',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n restockDate: '09/15/2025',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n restockDate: '10/05/2025',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n restockDate: '11/10/2025',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n restockDate: '12/20/2025',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n restockDate: '01/25/2026',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n editor: PikadayEditorComponent,\n renderer: PikadayRendererComponent,\n } as any,\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"devDependencies\": {\n \"@types/moment\": \"2.13.0\",\n \"@types/pikaday\": \"1.7.10\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectionStrategy, ElementRef, ViewChild } from '@angular/core';\nimport {\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n GridSettings,\n HotTableModule\n} from '@handsontable/angular-wrapper';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport './example1.css';\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\n\n@Component({\n standalone: true,\n selector: 'example1-pikaday-editor',\n template: `
    `,\n styles: [\n `\n :host { display: block; }\n .pikaday-container { width: 278px; }\n `,\n ],\n})\nexport class PikadayEditorComponent extends HotCellEditorAdvancedComponent {\n override position = 'portal' as const;\n @ViewChild('container', { static: true }) container!: ElementRef;\n private pikaday: Pikaday | null = null;\n\n override afterOpen(): void {\n const FORMAT = DATE_FORMAT_US;\n\n this.pikaday = new Pikaday({\n field: this.container.nativeElement,\n container: this.container.nativeElement,\n bound: false,\n format: FORMAT,\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n toString: (date: Date, format?: string) => moment(date).format(format),\n parse: (dateString: string, format: string) => moment(dateString, format).toDate(),\n onSelect: (date: Date) => {\n this.setValue(moment(date).format(FORMAT));\n },\n onClose: () => {\n this.finishEdit.emit();\n },\n });\n\n if (this.value) {\n const m = moment(this.value, FORMAT, true);\n\n if (m.isValid()) {\n this.pikaday.setDate(m.toDate(), true);\n }\n }\n\n this.pikaday.show();\n }\n\n override afterClose(): void {\n this.pikaday?.destroy();\n this.pikaday = null;\n }\n\n override onFocus(): void {\n this.container.nativeElement.focus();\n }\n}\n\n@Component({\n standalone: true,\n selector: 'example1-pikaday-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `{{ formattedDate }}`,\n})\nexport class PikadayRendererComponent extends HotCellRendererAdvancedComponent {\n get formattedDate(): string {\n if (!this.value) return '';\n const m = moment(this.value, DATE_FORMAT_US, true);\n\n return m.isValid() ? m.format(DATE_FORMAT_US) : this.value;\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-pikaday',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = [\n {\n itemName: 'Lunar Core',\n category: 'Lander',\n leadEngineer: 'Ellen Ripley',\n restockDate: '08/01/2025',\n cost: 350000,\n },\n {\n itemName: 'Zero Thrusters',\n category: 'Propulsion',\n leadEngineer: 'Sam Bell',\n restockDate: '09/15/2025',\n cost: 450000,\n },\n {\n itemName: 'EVA Suits',\n category: 'Equipment',\n leadEngineer: 'Alex Rogan',\n restockDate: '10/05/2025',\n cost: 150000,\n },\n {\n itemName: 'Solar Panels',\n category: 'Energy',\n leadEngineer: 'Dave Bowman',\n restockDate: '11/10/2025',\n cost: 75000,\n },\n {\n itemName: 'Comm Array',\n category: 'Communication',\n leadEngineer: 'Louise Banks',\n restockDate: '12/20/2025',\n cost: 125000,\n },\n {\n itemName: 'Habitat Dome',\n category: 'Shelter',\n leadEngineer: 'Dr. Ryan Stone',\n restockDate: '01/25/2026',\n cost: 1000000,\n },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n editor: PikadayEditorComponent,\n renderer: PikadayRendererComponent,\n } as any,\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.js.json index 252a4e32d..57630a753 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = moment(new Date(value), cellProperties.renderFormat).format(cellProperties.renderFormat);\n }),\n editor: editorFactory({\n position: 'portal',\n shortcuts: [\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowUp']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 7);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowDown']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 7);\n _event.preventDefault();\n },\n },\n ],\n init(editor) {\n editor.parentDestroyed = false;\n // create the input element on init. This is a text input that color picker will be attached to.\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.datePicker = editor.container;\n /**\n * Prevent recognizing clicking on datepicker as clicking outside of table.\n */\n editor.hot.rootDocument.addEventListener('mousedown', (event) => {\n if (event.target && event.target.classList.contains('pika-day')) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor) {\n const htInput = editor.input;\n const options = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) => moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n // Set the RTL to `false`. Due to the https://github.com/Pikaday/Pikaday/issues/647 bug, the layout direction\n // of the date picker is controlled by juggling the \"dir\" attribute of the root date picker element.\n options.isRTL = false;\n options.onSelect = function (date) {\n let dateStr;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia('(pointer: coarse)').matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor, event) {\n const dateFormat = editor.getDateFormat(editor);\n // TODO: view is not exported in the handsontable library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && 'key' in event ? event.key.length > 1 : false;\n\n let dateStr;\n\n editor.datePicker.style.display = 'block';\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n\n // TODO: _onInputFocus is not exported in the pikaday library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else {\n // if a default date is not defined, set a soft-default-date: display the current day and month in the\n // datepicker, but don't fill the editor input\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n afterOpen(editor, event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(editor) {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n height: 'auto',\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n dateFormat: DATE_FORMAT_US,\n defaultDate: '01/01/2020',\n datePickerConfig: {\n firstDay: 0,\n showWeekNumber: true,\n disableDayFn(date) {\n return date.getDay() === 0 || date.getDay() === 6;\n },\n },\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n/* start:skip-in-preview */\nconst inputData = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = moment(new Date(value), cellProperties.renderFormat).format(cellProperties.renderFormat);\n }),\n editor: editorFactory({\n position: 'portal',\n shortcuts: [\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowUp']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 7);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowDown']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 7);\n _event.preventDefault();\n },\n },\n ],\n init(editor) {\n editor.parentDestroyed = false;\n // create the input element on init. This is a text input that color picker will be attached to.\n editor.input = editor.hot.rootDocument.createElement('INPUT');\n editor.datePicker = editor.container;\n /**\n * Prevent recognizing clicking on datepicker as clicking outside of table.\n */\n editor.hot.rootDocument.addEventListener('mousedown', (event) => {\n if (event.target && event.target.classList.contains('pika-day')) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor) {\n const htInput = editor.input;\n const options = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) => moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n // Set the RTL to `false`. Due to the https://github.com/Pikaday/Pikaday/issues/647 bug, the layout direction\n // of the date picker is controlled by juggling the \"dir\" attribute of the root date picker element.\n options.isRTL = false;\n options.onSelect = function (date) {\n let dateStr;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia('(pointer: coarse)').matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor, event) {\n const dateFormat = editor.getDateFormat(editor);\n // TODO: view is not exported in the handsontable library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && 'key' in event ? event.key.length > 1 : false;\n\n let dateStr;\n\n editor.datePicker.style.display = 'block';\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n\n // TODO: _onInputFocus is not exported in the pikaday library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else {\n // if a default date is not defined, set a soft-default-date: display the current day and month in the\n // datepicker, but don't fill the editor input\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n afterOpen(editor, event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(editor) {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n height: 'auto',\n colHeaders: ['Item Name', 'Category', 'Lead Engineer', 'Restock Date', 'Cost'],\n autoRowSize: true,\n rowHeaders: true,\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'itemName', type: 'text', width: 130 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'leadEngineer', type: 'text', width: 150 },\n {\n data: 'restockDate',\n width: 150,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n dateFormat: DATE_FORMAT_US,\n defaultDate: '01/01/2020',\n datePickerConfig: {\n firstDay: 0,\n showWeekNumber: true,\n disableDayFn(date) {\n return date.getDay() === 0 || date.getDay() === 6;\n },\n },\n },\n {\n data: 'cost',\n type: 'numeric',\n width: 120,\n className: 'htRight',\n locale: 'en-US',\n numericFormat: {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.ts.json index c1d030b31..7623ef9b0 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport moment from \"moment\";\nimport Pikaday from \"pikaday\";\nimport \"pikaday/css/pikaday.css\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { rendererFactory } from \"handsontable/renderers\";\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst DATE_FORMAT_US = \"MM/DD/YYYY\";\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n\n/* start:skip-in-preview */\n\nconst inputData = [\n {\n id: 640329,\n itemName: \"Lunar Core\",\n itemNo: \"XJ-12\",\n leadEngineer: \"Ellen Ripley\",\n cost: 350000,\n inStock: true,\n category: \"Lander\",\n itemQuality: 87,\n origin: \"🇺🇸 USA\",\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: \"TechNova\",\n restockDate: \"2025-08-01\",\n operationalStatus: \"Awaiting Parts\",\n },\n {\n id: 863104,\n itemName: \"Zero Thrusters\",\n itemNo: \"QL-54\",\n leadEngineer: \"Sam Bell\",\n cost: 450000,\n inStock: false,\n category: \"Propulsion\",\n itemQuality: 0,\n origin: \"🇩🇪 Germany\",\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: \"PropelMax\",\n restockDate: \"2025-09-15\",\n operationalStatus: \"In Maintenance\",\n },\n {\n id: 395603,\n itemName: \"EVA Suits\",\n itemNo: \"PM-67\",\n leadEngineer: \"Alex Rogan\",\n cost: 150000,\n inStock: true,\n category: \"Equipment\",\n itemQuality: 79,\n origin: \"🇮🇹 Italy\",\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: \"SuitCraft\",\n restockDate: \"2025-10-05\",\n operationalStatus: \"Ready for Testing\",\n },\n {\n id: 679083,\n itemName: \"Solar Panels\",\n itemNo: \"BW-09\",\n leadEngineer: \"Dave Bowman\",\n cost: 75000,\n inStock: true,\n category: \"Energy\",\n itemQuality: 95,\n origin: \"🇺🇸 USA\",\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: \"SolarStream\",\n restockDate: \"2025-11-10\",\n operationalStatus: \"Operational\",\n },\n {\n id: 912663,\n itemName: \"Comm Array\",\n itemNo: \"ZR-56\",\n leadEngineer: \"Louise Banks\",\n cost: 125000,\n inStock: false,\n category: \"Communication\",\n itemQuality: 0,\n origin: \"🇯🇵 Japan\",\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: \"CommTech\",\n restockDate: \"2025-12-20\",\n operationalStatus: \"Decommissioned\",\n },\n {\n id: 315806,\n itemName: \"Habitat Dome\",\n itemNo: \"UJ-23\",\n leadEngineer: \"Dr. Ryan Stone\",\n cost: 1000000,\n inStock: true,\n category: \"Shelter\",\n itemQuality: 93,\n origin: \"🇨🇦 Canada\",\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: \"DomeInnovate\",\n restockDate: \"2026-01-25\",\n operationalStatus: \"Operational\",\n },\n {\n id: 954632,\n itemName: \"Oxygen Unit\",\n itemNo: \"FK-87\",\n leadEngineer: \"Dr. Grace Augustine\",\n cost: 600000,\n inStock: true,\n category: \"Life Support\",\n itemQuality: 85,\n origin: \"🇺🇸 USA\",\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: \"OxyGenius\",\n restockDate: \"2026-03-02\",\n operationalStatus: \"Awaiting Parts\",\n },\n {\n id: 734944,\n itemName: \"Processing Rig\",\n itemNo: \"LK-13\",\n leadEngineer: \"Jake Sully\",\n cost: 350000,\n inStock: true,\n category: \"Mining\",\n itemQuality: 81,\n origin: \"🇦🇺 Australia\",\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: \"RigTech\",\n restockDate: \"2026-04-15\",\n operationalStatus: \"Ready for Testing\",\n },\n {\n id: 834662,\n itemName: \"Navigation\",\n itemNo: \"XP-24\",\n leadEngineer: \"Dr. Ellie Arroway\",\n cost: 450000,\n inStock: true,\n category: \"Navigation\",\n itemQuality: 89,\n origin: \"🇫🇷 France\",\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: \"NavSolutions\",\n restockDate: \"2026-05-30\",\n operationalStatus: \"In Maintenance\",\n },\n {\n id: 714329,\n itemName: \"Surveyor Arm\",\n itemNo: \"QA-86\",\n leadEngineer: \"Mark Watney\",\n cost: 100000,\n inStock: true,\n category: \"Exploration\",\n itemQuality: 78,\n origin: \"🇺🇸 USA\",\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: \"ExploreTech\",\n restockDate: \"2026-07-12\",\n operationalStatus: \"Decommissioned\",\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\ntype EditorPropertiesType = {\n input: HTMLInputElement;\n pickaday: Pikaday;\n datePicker: HTMLDivElement;\n parentDestroyed: boolean;\n};\n\n// Helper type to extract the editor type from factory callbacks\ntype FactoryEditorType = Parameters<\n Parameters<\n typeof editorFactory\n >[0][\"init\"]\n>[0];\n\ntype EditorMethodsType = {\n showDatepicker: (\n editor: FactoryEditorType,\n event: Event | undefined,\n ) => void;\n hideDatepicker: (\n editor: FactoryEditorType,\n ) => void;\n getDatePickerConfig: (\n editor: FactoryEditorType,\n ) => Pikaday.PikadayOptions;\n getDateFormat: (\n editor: FactoryEditorType,\n ) => string;\n};\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = moment(new Date(value), cellProperties.renderFormat).format(\n cellProperties.renderFormat,\n );\n }),\n\n editor: editorFactory<\n EditorPropertiesType,\n EditorMethodsType\n >({\n position: \"portal\",\n shortcuts: [{\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"subtract\", 1);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowRight\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"add\", 1);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowUp\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"subtract\", 7);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowDown\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"add\", 7);\n _event.preventDefault();\n },\n }],\n init(editor) {\n editor.parentDestroyed = false;\n // create the input element on init. This is a text input that color picker will be attached to.\n editor.input = editor.hot.rootDocument.createElement(\n \"INPUT\",\n ) as HTMLInputElement;\n\n editor.datePicker = editor.container;\n\n /**\n * Prevent recognizing clicking on datepicker as clicking outside of table.\n */\n editor.hot.rootDocument.addEventListener(\"mousedown\", (event) => {\n if (\n event.target &&\n (event.target as HTMLElement).classList.contains(\"pika-day\")\n ) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor) {\n const htInput = editor.input;\n const options: Pikaday.PikadayOptions = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) =>\n moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n // Set the RTL to `false`. Due to the https://github.com/Pikaday/Pikaday/issues/647 bug, the layout direction\n // of the date picker is controlled by juggling the \"dir\" attribute of the root date picker element.\n options.isRTL = false;\n options.onSelect = function (date) {\n let dateStr;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia(\"(pointer: coarse)\").matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor, event) {\n const dateFormat = editor.getDateFormat(editor);\n // TODO: view is not exported in the handsontable library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && \"key\" in event\n ? (event as KeyboardEvent).key.length > 1\n : false;\n let dateStr;\n\n editor.datePicker.style.display = \"block\";\n\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n // TODO: _onInputFocus is not exported in the pikaday library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue(\"\");\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue(\"\");\n }\n } else {\n // if a default date is not defined, set a soft-default-date: display the current day and month in the\n // datepicker, but don't fill the editor input\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n\n afterOpen(editor, event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(\n editor: FactoryEditorType,\n ) {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n height: \"auto\",\n colHeaders: [\"Item Name\", \"Category\", \"Lead Engineer\", \"Restock Date\", \"Cost\"],\n autoRowSize: true,\n rowHeaders: true,\n width: \"100%\",\n autoWrapRow: true,\n headerClassName: \"htLeft\",\n columns: [\n { data: \"itemName\", type: \"text\", width: 130 },\n { data: \"category\", type: \"text\", width: 120 },\n { data: \"leadEngineer\", type: \"text\", width: 150 },\n {\n data: \"restockDate\",\n width: 150,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n dateFormat: DATE_FORMAT_US,\n defaultDate: \"01/01/2020\",\n datePickerConfig: {\n firstDay: 0,\n showWeekNumber: true,\n disableDayFn(date: Date) {\n return date.getDay() === 0 || date.getDay() === 6;\n },\n },\n },\n {\n data: \"cost\",\n type: \"numeric\",\n width: 120,\n className: \"htRight\",\n locale: \"en-US\",\n numericFormat: {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport moment from \"moment\";\nimport Pikaday from \"pikaday\";\nimport \"pikaday/css/pikaday.css\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { rendererFactory } from \"handsontable/renderers\";\n// Register all Handsontable's modules.\nregisterAllModules();\n\nconst DATE_FORMAT_US = \"MM/DD/YYYY\";\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n\n/* start:skip-in-preview */\n\nconst inputData = [\n {\n id: 640329,\n itemName: \"Lunar Core\",\n itemNo: \"XJ-12\",\n leadEngineer: \"Ellen Ripley\",\n cost: 350000,\n inStock: true,\n category: \"Lander\",\n itemQuality: 87,\n origin: \"🇺🇸 USA\",\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: \"TechNova\",\n restockDate: \"2025-08-01\",\n operationalStatus: \"Awaiting Parts\",\n },\n {\n id: 863104,\n itemName: \"Zero Thrusters\",\n itemNo: \"QL-54\",\n leadEngineer: \"Sam Bell\",\n cost: 450000,\n inStock: false,\n category: \"Propulsion\",\n itemQuality: 0,\n origin: \"🇩🇪 Germany\",\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: \"PropelMax\",\n restockDate: \"2025-09-15\",\n operationalStatus: \"In Maintenance\",\n },\n {\n id: 395603,\n itemName: \"EVA Suits\",\n itemNo: \"PM-67\",\n leadEngineer: \"Alex Rogan\",\n cost: 150000,\n inStock: true,\n category: \"Equipment\",\n itemQuality: 79,\n origin: \"🇮🇹 Italy\",\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: \"SuitCraft\",\n restockDate: \"2025-10-05\",\n operationalStatus: \"Ready for Testing\",\n },\n {\n id: 679083,\n itemName: \"Solar Panels\",\n itemNo: \"BW-09\",\n leadEngineer: \"Dave Bowman\",\n cost: 75000,\n inStock: true,\n category: \"Energy\",\n itemQuality: 95,\n origin: \"🇺🇸 USA\",\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: \"SolarStream\",\n restockDate: \"2025-11-10\",\n operationalStatus: \"Operational\",\n },\n {\n id: 912663,\n itemName: \"Comm Array\",\n itemNo: \"ZR-56\",\n leadEngineer: \"Louise Banks\",\n cost: 125000,\n inStock: false,\n category: \"Communication\",\n itemQuality: 0,\n origin: \"🇯🇵 Japan\",\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: \"CommTech\",\n restockDate: \"2025-12-20\",\n operationalStatus: \"Decommissioned\",\n },\n {\n id: 315806,\n itemName: \"Habitat Dome\",\n itemNo: \"UJ-23\",\n leadEngineer: \"Dr. Ryan Stone\",\n cost: 1000000,\n inStock: true,\n category: \"Shelter\",\n itemQuality: 93,\n origin: \"🇨🇦 Canada\",\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: \"DomeInnovate\",\n restockDate: \"2026-01-25\",\n operationalStatus: \"Operational\",\n },\n {\n id: 954632,\n itemName: \"Oxygen Unit\",\n itemNo: \"FK-87\",\n leadEngineer: \"Dr. Grace Augustine\",\n cost: 600000,\n inStock: true,\n category: \"Life Support\",\n itemQuality: 85,\n origin: \"🇺🇸 USA\",\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: \"OxyGenius\",\n restockDate: \"2026-03-02\",\n operationalStatus: \"Awaiting Parts\",\n },\n {\n id: 734944,\n itemName: \"Processing Rig\",\n itemNo: \"LK-13\",\n leadEngineer: \"Jake Sully\",\n cost: 350000,\n inStock: true,\n category: \"Mining\",\n itemQuality: 81,\n origin: \"🇦🇺 Australia\",\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: \"RigTech\",\n restockDate: \"2026-04-15\",\n operationalStatus: \"Ready for Testing\",\n },\n {\n id: 834662,\n itemName: \"Navigation\",\n itemNo: \"XP-24\",\n leadEngineer: \"Dr. Ellie Arroway\",\n cost: 450000,\n inStock: true,\n category: \"Navigation\",\n itemQuality: 89,\n origin: \"🇫🇷 France\",\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: \"NavSolutions\",\n restockDate: \"2026-05-30\",\n operationalStatus: \"In Maintenance\",\n },\n {\n id: 714329,\n itemName: \"Surveyor Arm\",\n itemNo: \"QA-86\",\n leadEngineer: \"Mark Watney\",\n cost: 100000,\n inStock: true,\n category: \"Exploration\",\n itemQuality: 78,\n origin: \"🇺🇸 USA\",\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: \"ExploreTech\",\n restockDate: \"2026-07-12\",\n operationalStatus: \"Decommissioned\",\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n\n/* end:skip-in-preview */\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\ntype EditorPropertiesType = {\n input: HTMLInputElement;\n pickaday: Pikaday;\n datePicker: HTMLDivElement;\n parentDestroyed: boolean;\n};\n\n// Helper type to extract the editor type from factory callbacks\ntype FactoryEditorType = Parameters<\n Parameters<\n typeof editorFactory\n >[0][\"init\"]\n>[0];\n\ntype EditorMethodsType = {\n showDatepicker: (\n editor: FactoryEditorType,\n event: Event | undefined,\n ) => void;\n hideDatepicker: (\n editor: FactoryEditorType,\n ) => void;\n getDatePickerConfig: (\n editor: FactoryEditorType,\n ) => Pikaday.PikadayOptions;\n getDateFormat: (\n editor: FactoryEditorType,\n ) => string;\n};\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n renderer: rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = moment(new Date(value), cellProperties.renderFormat).format(\n cellProperties.renderFormat,\n );\n }),\n\n editor: editorFactory<\n EditorPropertiesType,\n EditorMethodsType\n >({\n position: \"portal\",\n shortcuts: [{\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"subtract\", 1);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowRight\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"add\", 1);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowUp\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"subtract\", 7);\n _event.preventDefault();\n },\n }, {\n keys: [[\"ArrowDown\"]],\n callback: (editor, _event) => {\n //@ts-ignore\n editor.pickaday.adjustDate(\"add\", 7);\n _event.preventDefault();\n },\n }],\n init(editor) {\n editor.parentDestroyed = false;\n // create the input element on init. This is a text input that color picker will be attached to.\n editor.input = editor.hot.rootDocument.createElement(\n \"INPUT\",\n ) as HTMLInputElement;\n\n editor.datePicker = editor.container;\n\n /**\n * Prevent recognizing clicking on datepicker as clicking outside of table.\n */\n editor.hot.rootDocument.addEventListener(\"mousedown\", (event) => {\n if (\n event.target &&\n (event.target as HTMLElement).classList.contains(\"pika-day\")\n ) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor) {\n const htInput = editor.input;\n const options: Pikaday.PikadayOptions = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) =>\n moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n // Set the RTL to `false`. Due to the https://github.com/Pikaday/Pikaday/issues/647 bug, the layout direction\n // of the date picker is controlled by juggling the \"dir\" attribute of the root date picker element.\n options.isRTL = false;\n options.onSelect = function (date) {\n let dateStr;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia(\"(pointer: coarse)\").matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor, event) {\n const dateFormat = editor.getDateFormat(editor);\n // TODO: view is not exported in the handsontable library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && \"key\" in event\n ? (event as KeyboardEvent).key.length > 1\n : false;\n let dateStr;\n\n editor.datePicker.style.display = \"block\";\n\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n // TODO: _onInputFocus is not exported in the pikaday library d.ts, so we need to use @ts-ignore\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n // workaround for date/time cells - pikaday resets the cell value to 12:00 AM by default, this will overwrite the value.\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue(\"\");\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue(\"\");\n }\n } else {\n // if a default date is not defined, set a soft-default-date: display the current day and month in the\n // datepicker, but don't fill the editor input\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n\n afterOpen(editor, event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(\n editor: FactoryEditorType,\n ) {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n height: \"auto\",\n colHeaders: [\"Item Name\", \"Category\", \"Lead Engineer\", \"Restock Date\", \"Cost\"],\n autoRowSize: true,\n rowHeaders: true,\n width: \"100%\",\n autoWrapRow: true,\n headerClassName: \"htLeft\",\n columns: [\n { data: \"itemName\", type: \"text\", width: 130 },\n { data: \"category\", type: \"text\", width: 120 },\n { data: \"leadEngineer\", type: \"text\", width: 150 },\n {\n data: \"restockDate\",\n width: 150,\n allowInvalid: false,\n ...cellDefinition,\n renderFormat: DATE_FORMAT_US,\n dateFormat: DATE_FORMAT_US,\n defaultDate: \"01/01/2020\",\n datePickerConfig: {\n firstDay: 0,\n showWeekNumber: true,\n disableDayFn(date: Date) {\n return date.getDay() === 0 || date.getDay() === 6;\n },\n },\n },\n {\n data: \"cost\",\n type: \"numeric\",\n width: 120,\n className: \"htRight\",\n locale: \"en-US\",\n numericFormat: {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n },\n },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__react__example1.tsx.json index d1d1ea709..807c9e14e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__pikaday__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n\ninterface PikadayEditorInstance {\n parentDestroyed: boolean;\n input: HTMLInputElement;\n datePicker: HTMLElement;\n pickaday: Pikaday;\n}\n\nconst pikadayRenderer = rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = value ? moment(new Date(value as string), cellProperties.renderFormat).format(cellProperties.renderFormat) : '';\n});\n\nconst pikadayEditor = editorFactory({\n position: 'portal',\n shortcuts: [\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowUp']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 7);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowDown']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 7);\n _event.preventDefault();\n },\n },\n ],\n init(editor) {\n editor.parentDestroyed = false;\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.datePicker = editor.container;\n editor.hot.rootDocument.addEventListener('mousedown', (event: MouseEvent) => {\n const target = event.target as Element;\n\n if (target && target.classList.contains('pika-day')) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor: any) {\n const htInput = editor.input;\n const options: Record = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) => moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n options.isRTL = false;\n options.onSelect = function (date: Date) {\n let dateStr: string | undefined;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia('(pointer: coarse)').matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor: any) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor: any, event: Event) {\n const dateFormat = editor.getDateFormat(editor);\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && 'key' in event ? (event as KeyboardEvent).key.length > 1 : false;\n\n let dateStr: string;\n\n editor.datePicker.style.display = 'block';\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else {\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor: any) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n afterOpen(editor: any, event: Event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(editor: any): string {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n});\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst inputData: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Pikaday · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"moment\": \"2.31.0\",\n \"pikaday\": \"1.8.2\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport moment from 'moment';\nimport Pikaday from 'pikaday';\nimport 'pikaday/css/pikaday.css';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst DATE_FORMAT_US = 'MM/DD/YYYY';\nconst DEFAULT_DATE_FORMAT = DATE_FORMAT_US;\n\ninterface PikadayEditorInstance {\n parentDestroyed: boolean;\n input: HTMLInputElement;\n datePicker: HTMLElement;\n pickaday: Pikaday;\n}\n\nconst pikadayRenderer = rendererFactory(({ td, value, cellProperties }) => {\n td.innerText = value ? moment(new Date(value as string), cellProperties.renderFormat).format(cellProperties.renderFormat) : '';\n});\n\nconst pikadayEditor = editorFactory({\n position: 'portal',\n shortcuts: [\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 1);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowUp']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('subtract', 7);\n _event.preventDefault();\n },\n },\n {\n keys: [['ArrowDown']],\n callback: (editor, _event) => {\n // @ts-ignore\n editor.pickaday.adjustDate('add', 7);\n _event.preventDefault();\n },\n },\n ],\n init(editor) {\n editor.parentDestroyed = false;\n editor.input = editor.hot.rootDocument.createElement('INPUT') as HTMLInputElement;\n editor.datePicker = editor.container;\n editor.hot.rootDocument.addEventListener('mousedown', (event: MouseEvent) => {\n const target = event.target as Element;\n\n if (target && target.classList.contains('pika-day')) {\n editor.hideDatepicker(editor);\n }\n });\n },\n getDatePickerConfig(editor: any) {\n const htInput = editor.input;\n const options: Record = {};\n\n if (editor.cellProperties && editor.cellProperties.datePickerConfig) {\n Object.assign(options, editor.cellProperties.datePickerConfig);\n }\n\n const origOnSelect = options.onSelect;\n const origOnClose = options.onClose;\n\n options.field = htInput;\n options.trigger = htInput;\n options.container = editor.datePicker;\n options.bound = false;\n options.keyboardInput = false;\n options.format = options.format ?? editor.getDateFormat(editor);\n // Pikaday only formats and parses through Moment.js when it can reach `moment` itself, which\n // it cannot under a bundler. These two hooks take precedence over its internal path, so the\n // `format` above is honored both on display and on input.\n options.toString = (date, format) => moment(date).format(format);\n options.parse = (dateString, format) => moment(dateString, format).toDate();\n options.reposition = options.reposition || false;\n options.isRTL = false;\n options.onSelect = function (date: Date) {\n let dateStr: string | undefined;\n\n if (!isNaN(date.getTime())) {\n dateStr = moment(date).format(editor.getDateFormat(editor));\n }\n\n editor.setValue(dateStr);\n\n if (origOnSelect) {\n origOnSelect.call(editor.pickaday, date);\n }\n\n if (editor.hot.rootWindow.matchMedia('(pointer: coarse)').matches) {\n editor.hideDatepicker(editor);\n }\n };\n options.onClose = () => {\n if (!editor.parentDestroyed) {\n editor.finishEditing(false);\n }\n\n if (origOnClose) {\n origOnClose();\n }\n };\n\n return options;\n },\n hideDatepicker(editor: any) {\n editor.pickaday?.hide();\n },\n showDatepicker(editor: any, event: Event) {\n const dateFormat = editor.getDateFormat(editor);\n // @ts-ignore\n const isMouseDown = editor.hot.view.isMouseDown();\n // A printable character reports a single-character `key`; anything else is a function key.\n const isMeta = event && 'key' in event ? (event as KeyboardEvent).key.length > 1 : false;\n\n let dateStr: string;\n\n editor.datePicker.style.display = 'block';\n editor.pickaday = new Pikaday(editor.getDatePickerConfig(editor));\n\n // @ts-ignore\n editor.pickaday._onInputFocus = function () {};\n\n if (editor.originalValue) {\n dateStr = editor.originalValue;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (editor.getValue() !== editor.originalValue) {\n editor.setValue(editor.originalValue);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else if (editor.cellProperties.defaultDate) {\n dateStr = editor.cellProperties.defaultDate;\n\n if (moment(dateStr, dateFormat, true).isValid()) {\n editor.pickaday.setDate(moment(dateStr, dateFormat).toDate(), true);\n }\n\n if (!isMeta && !isMouseDown) {\n editor.setValue('');\n }\n } else {\n editor.pickaday.gotoToday();\n }\n },\n afterClose(editor: any) {\n if (editor.pickaday?.destroy) {\n editor.pickaday.destroy();\n }\n },\n afterOpen(editor: any, event: Event) {\n const cellRect = editor.TD.getBoundingClientRect();\n\n editor.input.style.width = `${cellRect.width}px`;\n editor.input.style.height = `${cellRect.height}px`;\n editor.showDatepicker(editor, event);\n },\n getValue(editor) {\n return editor.input.value;\n },\n setValue(editor, value) {\n editor.input.value = value == null ? '' : String(value);\n },\n getDateFormat(editor: any): string {\n return editor.cellProperties.dateFormat ?? DEFAULT_DATE_FORMAT;\n },\n});\n\n/* start:skip-in-preview */\ninterface InventoryItem {\n id: number;\n itemName: string;\n itemNo: string;\n leadEngineer: string;\n cost: number;\n inStock: boolean;\n category: string;\n itemQuality: number;\n origin: string;\n quantity: number;\n valueStock: number;\n repairable: boolean;\n supplierName: string;\n restockDate: string;\n operationalStatus: string;\n}\n\nconst inputData: InventoryItem[] = [\n {\n id: 640329,\n itemName: 'Lunar Core',\n itemNo: 'XJ-12',\n leadEngineer: 'Ellen Ripley',\n cost: 350000,\n inStock: true,\n category: 'Lander',\n itemQuality: 87,\n origin: '🇺🇸 USA',\n quantity: 2,\n valueStock: 700000,\n repairable: false,\n supplierName: 'TechNova',\n restockDate: '2025-08-01',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 863104,\n itemName: 'Zero Thrusters',\n itemNo: 'QL-54',\n leadEngineer: 'Sam Bell',\n cost: 450000,\n inStock: false,\n category: 'Propulsion',\n itemQuality: 0,\n origin: '🇩🇪 Germany',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'PropelMax',\n restockDate: '2025-09-15',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 395603,\n itemName: 'EVA Suits',\n itemNo: 'PM-67',\n leadEngineer: 'Alex Rogan',\n cost: 150000,\n inStock: true,\n category: 'Equipment',\n itemQuality: 79,\n origin: '🇮🇹 Italy',\n quantity: 50,\n valueStock: 7500000,\n repairable: true,\n supplierName: 'SuitCraft',\n restockDate: '2025-10-05',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 679083,\n itemName: 'Solar Panels',\n itemNo: 'BW-09',\n leadEngineer: 'Dave Bowman',\n cost: 75000,\n inStock: true,\n category: 'Energy',\n itemQuality: 95,\n origin: '🇺🇸 USA',\n quantity: 10,\n valueStock: 750000,\n repairable: false,\n supplierName: 'SolarStream',\n restockDate: '2025-11-10',\n operationalStatus: 'Operational',\n },\n {\n id: 912663,\n itemName: 'Comm Array',\n itemNo: 'ZR-56',\n leadEngineer: 'Louise Banks',\n cost: 125000,\n inStock: false,\n category: 'Communication',\n itemQuality: 0,\n origin: '🇯🇵 Japan',\n quantity: 0,\n valueStock: 0,\n repairable: true,\n supplierName: 'CommTech',\n restockDate: '2025-12-20',\n operationalStatus: 'Decommissioned',\n },\n {\n id: 315806,\n itemName: 'Habitat Dome',\n itemNo: 'UJ-23',\n leadEngineer: 'Dr. Ryan Stone',\n cost: 1000000,\n inStock: true,\n category: 'Shelter',\n itemQuality: 93,\n origin: '🇨🇦 Canada',\n quantity: 3,\n valueStock: 3000000,\n repairable: false,\n supplierName: 'DomeInnovate',\n restockDate: '2026-01-25',\n operationalStatus: 'Operational',\n },\n {\n id: 954632,\n itemName: 'Oxygen Unit',\n itemNo: 'FK-87',\n leadEngineer: 'Dr. Grace Augustine',\n cost: 600000,\n inStock: true,\n category: 'Life Support',\n itemQuality: 85,\n origin: '🇺🇸 USA',\n quantity: 15,\n valueStock: 9000000,\n repairable: true,\n supplierName: 'OxyGenius',\n restockDate: '2026-03-02',\n operationalStatus: 'Awaiting Parts',\n },\n {\n id: 734944,\n itemName: 'Processing Rig',\n itemNo: 'LK-13',\n leadEngineer: 'Jake Sully',\n cost: 350000,\n inStock: true,\n category: 'Mining',\n itemQuality: 81,\n origin: '🇦🇺 Australia',\n quantity: 25,\n valueStock: 8750000,\n repairable: true,\n supplierName: 'RigTech',\n restockDate: '2026-04-15',\n operationalStatus: 'Ready for Testing',\n },\n {\n id: 834662,\n itemName: 'Navigation',\n itemNo: 'XP-24',\n leadEngineer: 'Dr. Ellie Arroway',\n cost: 450000,\n inStock: true,\n category: 'Navigation',\n itemQuality: 89,\n origin: '🇫🇷 France',\n quantity: 8,\n valueStock: 3600000,\n repairable: false,\n supplierName: 'NavSolutions',\n restockDate: '2026-05-30',\n operationalStatus: 'In Maintenance',\n },\n {\n id: 714329,\n itemName: 'Surveyor Arm',\n itemNo: 'QA-86',\n leadEngineer: 'Mark Watney',\n cost: 100000,\n inStock: true,\n category: 'Exploration',\n itemQuality: 78,\n origin: '🇺🇸 USA',\n quantity: 40,\n valueStock: 4000000,\n repairable: true,\n supplierName: 'ExploreTech',\n restockDate: '2026-07-12',\n operationalStatus: 'Decommissioned',\n },\n];\n\nconst data = inputData.map((item) => ({\n ...item,\n restockDate: moment(new Date(item.restockDate)).format(DATE_FORMAT_US),\n}));\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".ht_editor_visible > input {\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n outline: none;\n margin-top: -1px;\n margin-left: -1px;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent) !important;\n background-color: var(--ht-cell-editor-background-color, #ffffff) !important;\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px) !important;\n border: none !important;\n font-family: inherit;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n}\n.ht_editor_visible > input:focus-visible {\n border: none !important;\n outline: none !important;\n}\n\n/* Pikaday's own stylesheet ships hardcoded light-mode colors. These rules re-point every\n visual property at Handsontable's theme variables, so the calendar follows the active\n theme -- including dark mode.\n\n Every selector is scoped to the element carrying the theme class. That element is the\n body-level `.ht-portal` the editor is attached to by `position: 'portal'`, so the\n `--ht-*` variables and the theme's `color-scheme` resolve on the calendar's own\n ancestor. Scoping this way also keeps each rule one class more specific than the\n matching rule in `pikaday.css`, which wins on source order otherwise.\n\n Handsontable shipped equivalent rules until 18.0, when the built-in Pikaday date editor\n was replaced by a native date input. The recipe now owns them. */\n[class*='ht-theme-'] .pika-single {\n position: relative;\n display: block;\n z-index: 9999;\n padding: 10px;\n font-family: var(--ht-font-family), -apple-system, BlinkMacSystemFont, \"Segoe UI\",\n sans-serif;\n font-size: var(--ht-font-size);\n line-height: var(--ht-line-height);\n font-weight: var(--ht-font-weight);\n color: var(--ht-foreground-color);\n background: var(--ht-background-color, #ffffff);\n border: var(--ht-menu-border-width, 1px) solid var(--ht-menu-border-color, #e5e5e9);\n border-radius: var(--ht-menu-border-radius);\n box-shadow: var(--ht-menu-shadow-x, 0) var(--ht-menu-shadow-y, 0)\n var(--ht-menu-shadow-blur, 8px)\n color-mix(\n in srgb,\n var(--ht-menu-shadow-color, rgba(0, 0, 0)) var(--ht-menu-shadow-opacity, 100%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single.is-hidden {\n display: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-row {\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-title {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label {\n position: relative;\n order: 2;\n padding: 5px;\n color: var(--ht-accent-color);\n background-color: transparent;\n}\n\n[class*='ht-theme-'] .pika-single .pika-label .pika-select {\n position: absolute;\n inset: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n/* Replace Pikaday's baked-in PNG arrows with the theme's chevron. `currentColor` on the\n mask keeps them in step with the accent color in both light and dark mode. */\n[class*='ht-theme-'] .pika-single .pika-prev,\n[class*='ht-theme-'] .pika-single .pika-next {\n width: var(--ht-icon-size, 20px);\n height: var(--ht-icon-size, 20px);\n padding: 0;\n white-space: nowrap;\n text-indent: -9999px;\n cursor: pointer;\n opacity: 1;\n color: var(--ht-accent-color);\n border: none;\n background-image: none;\n background-color: currentColor;\n -webkit-mask-size: contain;\n mask-size: contain;\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-position: center;\n mask-position: center;\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev.is-disabled,\n[class*='ht-theme-'] .pika-single .pika-next.is-disabled {\n opacity: 0.2;\n cursor: default;\n}\n\n[class*='ht-theme-'] .pika-single .pika-next {\n order: 3;\n margin-left: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.64648 10.9393L9.93938 7.64644L6.64648 4.35354' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n[class*='ht-theme-'] .pika-single .pika-prev {\n order: 1;\n margin-right: auto;\n -webkit-mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n mask-image: url(\"data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.49268 11.2929L6.19978 8.00001L9.49268 4.70712' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E%0A\");\n}\n\n.pika-single .pika-table,\n[class*='ht-theme-'] .pika-single .pika-table {\n border-collapse: collapse;\n table-layout: fixed;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table thead {\n height: 50px;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th {\n padding: 1px;\n vertical-align: middle;\n color: var(--ht-foreground-color);\n}\n\n[class*='ht-theme-'] .pika-single .pika-table th abbr {\n text-decoration: none;\n font-weight: normal;\n border: none;\n cursor: initial;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td {\n padding: 1px;\n vertical-align: middle;\n}\n\n.pika-single .pika-table .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table .pika-button {\n width: 100%;\n aspect-ratio: 1 / 1;\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n background: transparent;\n color: var(--ht-foreground-color);\n border: none;\n border-radius: var(--ht-button-border-radius);\n box-shadow: none;\n cursor: pointer;\n font-size: inherit;\n text-align: center !important;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table .pika-button:hover,\n[class*='ht-theme-'] .pika-single .pika-table td.is-today .pika-button {\n color: var(--ht-foreground-color);\n background: color-mix(\n in srgb,\n var(--ht-menu-item-hover-color) var(--ht-menu-item-hover-color-opacity, 12%),\n transparent\n );\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button,\n[class*='ht-theme-'] .pika-single .pika-table td.is-selected .pika-button:hover {\n background: var(--ht-accent-color, #1a42e8);\n color: var(--ht-primary-button-foreground-color, #ffffff);\n box-shadow: none;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-disabled .pika-button {\n pointer-events: none;\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.is-outside-current-month .pika-button {\n opacity: 0.5;\n}\n\n[class*='ht-theme-'] .pika-single .pika-table td.pika-week {\n width: calc(100% / 8);\n text-align: center;\n color: var(--ht-foreground-color);\n}\n\n/* Right-to-left: Pikaday adds `.is-rtl` to the calendar root. */\n[class*='ht-theme-'] .pika-single.is-rtl .pika-next {\n transform: rotate(180deg);\n margin-left: 0;\n margin-right: auto;\n}\n\n[class*='ht-theme-'] .pika-single.is-rtl .pika-prev {\n transform: rotate(180deg);\n margin-left: auto;\n margin-right: 0;\n}"},"docsPath":"recipes/cell-types/pikaday/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Pikaday"],"guide":"recipes/cell-types/pikaday/pikaday.md","guideTitle":"Pikaday","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/pikaday","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__angular__example1.ts.json index dcddafbbf..7beeb6738 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst inputData = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\nclass RadioEditor extends BaseEditor {\n override init(): void {}\n override open(): void {}\n override close(): void {}\n override focus(): void {}\n override getValue(): string { return this.originalValue as string; }\n override setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer } as any);\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-radio',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', width: 160, options: priorityOptions } as Handsontable.ColumnSettings,\n { data: 'status', type: 'radio', width: 170, options: statusOptions } as Handsontable.ColumnSettings,\n ],\n afterInit(this: Handsontable.Core) {\n this.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = this.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (this.getCellMeta(r, c)['type'] !== 'radio') return;\n\n const td = this.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n }, true);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst inputData = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\nclass RadioEditor extends BaseEditor {\n override init(): void {}\n override open(): void {}\n override close(): void {}\n override focus(): void {}\n override getValue(): string { return this.originalValue as string; }\n override setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer } as any);\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-radio',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', width: 160, options: priorityOptions } as Handsontable.ColumnSettings,\n { data: 'status', type: 'radio', width: 170, options: statusOptions } as Handsontable.ColumnSettings,\n ],\n afterInit(this: Handsontable.Core) {\n this.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = this.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (this.getCellMeta(r, c)['type'] !== 'radio') return;\n\n const td = this.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n }, true);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.js.json index 3d0eb5654..a5214157f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\n// Minimal editor stub — all interaction is handled by the renderer.\nclass RadioEditor extends BaseEditor {\n init() {}\n open() {}\n close() {}\n focus() {}\n getValue() {\n return this.originalValue;\n }\n setValue(value) {\n this.originalValue = value;\n }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options = cellProperties.options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly && cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n // Cycle to the next or previous option and commit via setDataAtCell.\n // queueMicrotask restores focus after Handsontable re-renders the cell.\n const cycle = (direction) => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next' ? (i === last || i === -1 ? 0 : i + 1) : i <= 0 ? last : i - 1;\n const newValue = typeof options[next] === 'object' ? options[next].value : options[next];\n\n instance.setDataAtCell(row, column, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row, column);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n // Roving tabindex: exactly one radio per group is tabbable.\n input.tabIndex = input.checked || (!hasChecked && idx === 0) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = e.target.value;\n\n instance.setDataAtCell(row, column, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row, column);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row, column);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n // Block other keys from reaching Handsontable's shortcut system.\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\n\nconst priorityOptions = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', options: priorityOptions, width: 160 },\n { data: 'status', type: 'radio', options: statusOptions, width: 170 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);\n\n// Enter / F2 on a radio cell: move focus to the checked (or first) radio input.\n// Use capture so this fires before Handsontable's own keydown handlers.\nhot.rootElement.addEventListener(\n 'keydown',\n (e) => {\n if (e.target.tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = hot.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (hot.getCellMeta(r, c).type !== 'radio') return;\n\n const td = hot.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked') ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n },\n true,\n);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\n// Minimal editor stub — all interaction is handled by the renderer.\nclass RadioEditor extends BaseEditor {\n init() {}\n open() {}\n close() {}\n focus() {}\n getValue() {\n return this.originalValue;\n }\n setValue(value) {\n this.originalValue = value;\n }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options = cellProperties.options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly && cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n // Cycle to the next or previous option and commit via setDataAtCell.\n // queueMicrotask restores focus after Handsontable re-renders the cell.\n const cycle = (direction) => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next' ? (i === last || i === -1 ? 0 : i + 1) : i <= 0 ? last : i - 1;\n const newValue = typeof options[next] === 'object' ? options[next].value : options[next];\n\n instance.setDataAtCell(row, column, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row, column);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n // Roving tabindex: exactly one radio per group is tabbable.\n input.tabIndex = input.checked || (!hasChecked && idx === 0) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = e.target.value;\n\n instance.setDataAtCell(row, column, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row, column);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row, column);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n // Block other keys from reaching Handsontable's shortcut system.\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\n\nconst priorityOptions = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', options: priorityOptions, width: 160 },\n { data: 'status', type: 'radio', options: statusOptions, width: 170 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);\n\n// Enter / F2 on a radio cell: move focus to the checked (or first) radio input.\n// Use capture so this fires before Handsontable's own keydown handlers.\nhot.rootElement.addEventListener(\n 'keydown',\n (e) => {\n if (e.target.tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = hot.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (hot.getCellMeta(r, c).type !== 'radio') return;\n\n const td = hot.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked') ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n },\n true,\n);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.ts.json index 44ae1160e..e38a851c1 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\n// Minimal editor stub — all interaction is handled by the renderer.\nclass RadioEditor extends BaseEditor {\n init(): void {}\n open(): void {}\n close(): void {}\n focus(): void {}\n getValue(): string { return this.originalValue as string; }\n setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n // Cycle to the next or previous option and commit via setDataAtCell.\n // queueMicrotask restores focus after Handsontable re-renders the cell.\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n // Roving tabindex: exactly one radio per group is tabbable.\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n // Block other keys from reaching Handsontable's shortcut system.\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', options: priorityOptions, width: 160 } as Handsontable.ColumnSettings,\n { data: 'status', type: 'radio', options: statusOptions, width: 170 } as Handsontable.ColumnSettings,\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);\n\n// Enter / F2 on a radio cell: move focus to the checked (or first) radio input.\n// Use capture so this fires before Handsontable's own keydown handlers.\nhot.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = hot.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (hot.getCellMeta(r, c).type !== 'radio') return;\n\n const td = hot.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n}, true);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\n// Minimal editor stub — all interaction is handled by the renderer.\nclass RadioEditor extends BaseEditor {\n init(): void {}\n open(): void {}\n close(): void {}\n focus(): void {}\n getValue(): string { return this.originalValue as string; }\n setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n // Cycle to the next or previous option and commit via setDataAtCell.\n // queueMicrotask restores focus after Handsontable re-renders the cell.\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n // Roving tabindex: exactly one radio per group is tabbable.\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n // Block other keys from reaching Handsontable's shortcut system.\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1')!;\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: ['Task', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n rowHeights: 96,\n columns: [\n { data: 'task', type: 'text', width: 300 },\n { data: 'priority', type: 'radio', options: priorityOptions, width: 160 } as Handsontable.ColumnSettings,\n { data: 'status', type: 'radio', options: statusOptions, width: 170 } as Handsontable.ColumnSettings,\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);\n\n// Enter / F2 on a radio cell: move focus to the checked (or first) radio input.\n// Use capture so this fires before Handsontable's own keydown handlers.\nhot.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = hot.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (hot.getCellMeta(r, c).type !== 'radio') return;\n\n const td = hot.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n}, true);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__react__example1.tsx.json index a8c9d06a4..2482b1e20 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\nclass RadioEditor extends BaseEditor {\n init(): void {}\n open(): void {}\n close(): void {}\n focus(): void {}\n getValue(): string { return this.originalValue as string; }\n setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\ninterface TaskRow {\n task: string;\n priority: string;\n status: string;\n}\n\n/* start:skip-in-preview */\nconst data: TaskRow[] = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef<{ hotInstance: Handsontable.Core | null }>(null);\n\n const afterInit = function(this: Handsontable.Core) {\n this.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = this.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (this.getCellMeta(r, c).type !== 'radio') return;\n\n const td = this.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n }, true);\n };\n\n return (\n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nimport { BaseEditor } from 'handsontable/editors/baseEditor';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport type { CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype RadioOption = { value: string; label: string } | string;\n\ninterface RadioCellProperties extends CellProperties {\n options: RadioOption[];\n}\n\nclass RadioEditor extends BaseEditor {\n init(): void {}\n open(): void {}\n close(): void {}\n focus(): void {}\n getValue(): string { return this.originalValue as string; }\n setValue(value: string): void { this.originalValue = value; }\n}\n\nconst radioRenderer = rendererFactory(({ instance, td, row, column, value, cellProperties }) => {\n while (td.firstChild) td.removeChild(td.firstChild);\n\n const options: RadioOption[] = (cellProperties as RadioCellProperties).options || [];\n const wrapper = document.createElement('div');\n\n wrapper.className = 'htRadioCell';\n wrapper.setAttribute('role', 'radiogroup');\n\n const colHeader = instance.getColHeader(column as number);\n\n if (colHeader) wrapper.setAttribute('aria-label', String(colHeader));\n\n // A cell with no editor cannot be changed by the user, so its radios are disabled the same\n // way `readOnly` disables them. `editor: false` set at any configuration level reaches the\n // cell through the cascade. Read the option directly: `getCellEditor()` throws on an editor\n // name that isn't registered, and a renderer runs on every draw.\n const isEditable = !cellProperties.readOnly &&\n cellProperties.editor !== false && cellProperties.editor !== null;\n\n const hasChecked = options.some((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n\n const cycle = (direction: 'next' | 'prev') => {\n if (!options.length) return;\n const i = options.findIndex((opt) => {\n const v = typeof opt === 'object' ? opt.value : opt;\n\n return String(v) === String(value);\n });\n const last = options.length - 1;\n const next = direction === 'next'\n ? (i === last || i === -1 ? 0 : i + 1)\n : (i <= 0 ? last : i - 1);\n const newValue = typeof options[next] === 'object'\n ? (options[next] as { value: string }).value\n : (options[next] as string);\n\n instance.setDataAtCell(row as number, column as number, newValue);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(newValue)}\"]`)?.focus();\n });\n };\n\n options.forEach((opt, idx) => {\n const optValue = typeof opt === 'object' ? opt.value : opt;\n const optLabel = typeof opt === 'object' ? opt.label : opt;\n const label = document.createElement('label');\n\n label.className = 'htUIRadio';\n\n const input = document.createElement('input');\n\n input.type = 'radio';\n input.className = 'htUIRadioInput';\n input.name = `radio-r${row}-c${column}`;\n input.value = optValue;\n input.checked = String(optValue) === String(value);\n input.tabIndex = (input.checked || (!hasChecked && idx === 0)) ? 0 : -1;\n input.disabled = !isEditable;\n\n const span = document.createElement('span');\n\n span.className = 'htUIRadioLabel';\n span.textContent = optLabel;\n\n // The checked dot is a real `` element (Handsontable\n // itself inserts one as the input's next sibling for its own radio UI), not a CSS\n // pseudo-element -- so the recipe must add it explicitly to get the dot.\n const icon = document.createElement('i');\n\n icon.className = 'ht-icon ht-icon-radio';\n icon.setAttribute('aria-hidden', 'true');\n\n label.appendChild(input);\n label.appendChild(icon);\n label.appendChild(span);\n wrapper.appendChild(label);\n\n input.addEventListener('change', (e) => {\n e.stopPropagation();\n const v = (e.target as HTMLInputElement).value;\n\n instance.setDataAtCell(row as number, column as number, v);\n queueMicrotask(() => {\n const newTd = instance.getCell(row as number, column as number);\n\n newTd?.querySelector(`input[type=\"radio\"][value=\"${CSS.escape(v)}\"]`)?.focus();\n });\n });\n\n // Stop mousedown so Handsontable doesn't hijack the click for cell selection - but only\n // while the radios are interactive. On a non-editable cell the click would otherwise do\n // nothing at all, leaving no way to select the cell by clicking it.\n label.addEventListener('mousedown', (e) => {\n if (isEditable) {\n e.stopPropagation();\n }\n });\n\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n instance.selectCell(row as number, column as number);\n\n return;\n }\n if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\n e.preventDefault();\n e.stopPropagation();\n cycle('next');\n\n return;\n }\n if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\n e.preventDefault();\n e.stopPropagation();\n cycle('prev');\n\n return;\n }\n e.stopPropagation();\n });\n });\n\n td.appendChild(wrapper);\n td.style.verticalAlign = 'top';\n});\n\nregisterCellType('radio', { editor: RadioEditor, renderer: radioRenderer });\n\ninterface TaskRow {\n task: string;\n priority: string;\n status: string;\n}\n\n/* start:skip-in-preview */\nconst data: TaskRow[] = [\n { task: 'Refactor licensing app navigation', priority: 'high', status: 'in-progress' },\n { task: 'Theme Builder onboarding tour', priority: 'medium', status: 'todo' },\n { task: 'MCP server v1 release prep', priority: 'high', status: 'in-progress' },\n { task: 'GitHub triage rotation docs', priority: 'low', status: 'done' },\n { task: 'shadcn/ui integration recipe', priority: 'medium', status: 'todo' },\n];\n/* end:skip-in-preview */\n\nconst priorityOptions: RadioOption[] = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n];\n\nconst statusOptions: RadioOption[] = [\n { value: 'todo', label: 'Todo' },\n { value: 'in-progress', label: 'In progress' },\n { value: 'done', label: 'Done' },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef<{ hotInstance: Handsontable.Core | null }>(null);\n\n const afterInit = function(this: Handsontable.Core) {\n this.rootElement.addEventListener('keydown', (e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.key !== 'Enter' && e.key !== 'F2') return;\n\n const sel = this.getSelectedLast();\n\n if (!sel) return;\n\n const [r, c] = sel;\n\n if (this.getCellMeta(r, c).type !== 'radio') return;\n\n const td = this.getCell(r, c);\n const target = td?.querySelector('input[type=\"radio\"]:checked')\n ?? td?.querySelector('input[type=\"radio\"]');\n\n if (target) {\n e.stopImmediatePropagation();\n e.preventDefault();\n target.focus();\n }\n }, true);\n };\n\n return (\n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Scoped to .htRadioCell so theme's .htUIRadio styles in context menus and\n filter panels are not affected. The ring, colors, and checked state are\n intentionally left to the Handsontable theme; the checked dot is a\n `.ht-icon-radio` element the renderer inserts as the input's next sibling\n (see Step 4 in the guide), not something this stylesheet draws. */\n.htRadioCell {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n line-height: 1.4;\n}\n\n.htRadioCell .htUIRadio {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: var(--ht-foreground-color, #1f2937);\n padding: 2px 6px !important;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n}\n\n.htRadioCell .htUIRadioLabel {\n flex: 1;\n}\n\n/* Ensure pointer cursor and prevent default outline; theme handles appearance. */\n.htRadioCell .htUIRadio > input[type='radio'] {\n cursor: pointer;\n}"},"docsPath":"recipes/cell-types/radio/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__vue__example1.vue.json index 242d18ea4..e93205cc1 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__radio__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"recipes/cell-types/radio/vue/example1.vue","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"Vue 3"} +{"framework":"vue","displayName":"Recipes ▸ Cell Types ▸ Radio buttons · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n\n\n"},"docsPath":"recipes/cell-types/radio/vue/example1.vue","breadcrumb":["Recipes","Cell Types","Radio buttons"],"guide":"recipes/cell-types/radio/radio.md","guideTitle":"Radio buttons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/radio","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__angular__example1.ts.json index 66222a705..36974768c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n KeyboardShortcutConfig,\n HotTableModule\n} from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst starSvg =\n '';\n\nconst inputData = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n selector: 'example1-star-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    `,\n})\nexport class StarRendererComponent extends HotCellRendererAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup: SafeHtml = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n}\n\n@Component({\n standalone: true,\n selector: 'example1-star-editor',\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    \n `,\n})\nexport class StarEditorComponent extends HotCellEditorAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup: SafeHtml = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n\n isCurrentStar(index: number): boolean {\n return (index + 1) === parseInt(this.getValue()?.toString() ?? '0', 10);\n }\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (_editor, event) => {\n this.setValue(parseInt((event as KeyboardEvent).key, 10));\n this.cdr.detectChanges();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (_editor, _event) => {\n if (parseInt(this.getValue()?.toString() ?? '0') < 5) {\n this.setValue(parseInt(this.getValue()?.toString() ?? '0') + 1);\n this.cdr.detectChanges();\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (_editor, _event) => {\n if (parseInt(this.getValue()?.toString() ?? '0') > 1) {\n this.setValue(parseInt(this.getValue()?.toString() ?? '0') - 1);\n this.cdr.detectChanges();\n }\n },\n },\n ];\n\n onMouseOver(event: MouseEvent): void {\n const star = (event.target as HTMLElement).closest('.rating-star') as HTMLElement | null;\n\n if (\n star?.dataset['value'] &&\n parseInt(this.getValue()?.toString() ?? '0') !== parseInt(star.dataset['value'], 10)\n ) {\n this.setValue(parseInt(star.dataset['value'], 10));\n this.cdr.detectChanges();\n }\n }\n\n onMouseDown(): void {\n this.finishEdit.emit();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-rating',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Product', 'Category', 'Rating', 'Reviews', 'Price'],\n columns: [\n { data: 'product', type: 'text', width: 240 },\n { data: 'category', type: 'text', width: 120 },\n {\n data: 'rating',\n width: 150,\n renderer: StarRendererComponent,\n editor: StarEditorComponent,\n validator: (value: unknown, callback: (valid: boolean) => void) => {\n const num = parseInt(String(value), 10);\n\n callback(num >= 1 && num <= 5);\n },\n },\n { data: 'reviews', type: 'numeric', width: 80 },\n { data: 'price', type: 'numeric', width: 80 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0);\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n GridSettings,\n HotCellEditorAdvancedComponent,\n HotCellRendererAdvancedComponent,\n KeyboardShortcutConfig,\n HotTableModule\n} from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst starSvg =\n '';\n\nconst inputData = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n selector: 'example1-star-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    `,\n})\nexport class StarRendererComponent extends HotCellRendererAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup: SafeHtml = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n}\n\n@Component({\n standalone: true,\n selector: 'example1-star-editor',\n template: `\n
    \n @for (star of stars; track $index) {\n \n }\n
    \n `,\n})\nexport class StarEditorComponent extends HotCellEditorAdvancedComponent {\n readonly stars = Array(5);\n readonly starSvgMarkup: SafeHtml = inject(DomSanitizer).bypassSecurityTrustHtml(starSvg);\n\n isCurrentStar(index: number): boolean {\n return (index + 1) === parseInt(this.getValue()?.toString() ?? '0', 10);\n }\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n override shortcuts?: KeyboardShortcutConfig[] = [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (_editor, event) => {\n this.setValue(parseInt((event as KeyboardEvent).key, 10));\n this.cdr.detectChanges();\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (_editor, _event) => {\n if (parseInt(this.getValue()?.toString() ?? '0') < 5) {\n this.setValue(parseInt(this.getValue()?.toString() ?? '0') + 1);\n this.cdr.detectChanges();\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (_editor, _event) => {\n if (parseInt(this.getValue()?.toString() ?? '0') > 1) {\n this.setValue(parseInt(this.getValue()?.toString() ?? '0') - 1);\n this.cdr.detectChanges();\n }\n },\n },\n ];\n\n onMouseOver(event: MouseEvent): void {\n const star = (event.target as HTMLElement).closest('.rating-star') as HTMLElement | null;\n\n if (\n star?.dataset['value'] &&\n parseInt(this.getValue()?.toString() ?? '0') !== parseInt(star.dataset['value'], 10)\n ) {\n this.setValue(parseInt(star.dataset['value'], 10));\n this.cdr.detectChanges();\n }\n }\n\n onMouseDown(): void {\n this.finishEdit.emit();\n }\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-rating',\n template: `
    `,\n})\nexport class AppComponent {\n readonly data = inputData;\n\n readonly gridSettings: GridSettings = {\n autoRowSize: true,\n rowHeaders: true,\n autoWrapRow: true,\n height: 'auto',\n width: '100%',\n headerClassName: 'htLeft',\n colHeaders: ['Product', 'Category', 'Rating', 'Reviews', 'Price'],\n columns: [\n { data: 'product', type: 'text', width: 240 },\n { data: 'category', type: 'text', width: 120 },\n {\n data: 'rating',\n width: 150,\n renderer: StarRendererComponent,\n editor: StarEditorComponent,\n validator: (value: unknown, callback: (valid: boolean) => void) => {\n const num = parseInt(String(value), 10);\n\n callback(num >= 1 && num <= 5);\n },\n },\n { data: 'reviews', type: 'numeric', width: 80 },\n { data: 'price', type: 'numeric', width: 80 },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0);\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px) var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/angular/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.js.json index f0df3e72f..c17b47e06 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst starSvg =\n '';\n\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) => `${starSvg}`\n ).join('')}
    `;\n }),\n validator: (value, callback) => {\n value = parseInt(value);\n callback(value >= 0 && value <= 100);\n },\n editor: editorFactory({\n shortcuts: [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue(_event.key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('DIV');\n editor.input.classList.add('rating-editor');\n },\n afterInit(editor) {\n editor.input.addEventListener('mouseover', (event) => {\n const star = event.target.closest('.rating-star');\n\n if (star?.dataset.value && parseInt(editor.value) !== parseInt(star.dataset.value)) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener('mousedown', () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`\n ).join('');\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Product', 'Category', 'Rating', 'Reviews', 'Price'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 240 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'rating', width: 150, ...cellDefinition },\n { data: 'reviews', type: 'numeric', width: 80 },\n { data: 'price', type: 'numeric', width: 80 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector('#example1');\nconst starSvg =\n '';\n\nconst cellDefinition = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) => `${starSvg}`\n ).join('')}
    `;\n }),\n validator: (value, callback) => {\n value = parseInt(value);\n callback(value >= 0 && value <= 100);\n },\n editor: editorFactory({\n shortcuts: [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue(_event.key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('DIV');\n editor.input.classList.add('rating-editor');\n },\n afterInit(editor) {\n editor.input.addEventListener('mouseover', (event) => {\n const star = event.target.closest('.rating-star');\n\n if (star?.dataset.value && parseInt(editor.value) !== parseInt(star.dataset.value)) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener('mousedown', () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`\n ).join('');\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions = {\n data,\n colHeaders: ['Product', 'Category', 'Rating', 'Reviews', 'Price'],\n autoRowSize: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n headerClassName: 'htLeft',\n columns: [\n { data: 'product', type: 'text', width: 240 },\n { data: 'category', type: 'text', width: 120 },\n { data: 'rating', width: 150, ...cellDefinition },\n { data: 'reviews', type: 'numeric', width: 80 },\n { data: 'price', type: 'numeric', width: 80 },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/javascript/example1.js","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.ts.json index 39abe3f98..6bc00e2e0 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { rendererFactory } from \"handsontable/renderers\";\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { product: \"Dashboard Pro\", category: \"Analytics\", rating: 5, reviews: 342, price: 49 },\n { product: \"Form Builder\", category: \"Tools\", rating: 4, reviews: 218, price: 29 },\n { product: \"Chart Engine\", category: \"Analytics\", rating: 3, reviews: 156, price: 39 },\n { product: \"Auth Module\", category: \"Security\", rating: 5, reviews: 89, price: 19 },\n { product: \"File Manager\", category: \"Storage\", rating: 2, reviews: 64, price: 15 },\n { product: \"Email Service\", category: \"Communication\", rating: 4, reviews: 275, price: 25 },\n { product: \"Search Index\", category: \"Tools\", rating: 1, reviews: 31, price: 35 },\n { product: \"Cache Layer\", category: \"Infra\", rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\nconst starSvg =\n '';\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`,\n ).join(\"\")}
    `;\n }),\n validator: (value, callback) => {\n value = parseInt(value);\n callback(value >= 0 && value <= 100);\n },\n\n editor: editorFactory<{ input: HTMLDivElement }>({\n shortcuts: [\n {\n keys: [[\"1\"], [\"2\"], [\"3\"], [\"4\"], [\"5\"]],\n callback: (editor, _event) => {\n editor.setValue((_event as KeyboardEvent).key);\n },\n },\n {\n keys: [[\"ArrowRight\"]],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement(\n \"DIV\",\n ) as HTMLDivElement;\n editor.input.classList.add(\"rating-editor\");\n },\n afterInit(editor) {\n editor.input.addEventListener(\"mouseover\", (event) => {\n const star = (event.target as HTMLElement).closest(\n \".rating-star\",\n ) as HTMLElement | null;\n\n if (\n star?.dataset.value &&\n parseInt(editor.value) !== parseInt(star.dataset.value)\n ) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener(\"mousedown\", () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`,\n ).join(\"\");\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: [\"Product\", \"Category\", \"Rating\", \"Reviews\", \"Price\"],\n autoRowSize: true,\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n autoWrapRow: true,\n headerClassName: \"htLeft\",\n columns: [\n { data: \"product\", type: \"text\", width: 240 },\n { data: \"category\", type: \"text\", width: 120 },\n { data: \"rating\", width: 150, ...cellDefinition },\n { data: \"reviews\", type: \"numeric\", width: 80 },\n { data: \"price\", type: \"numeric\", width: 80 },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { CellProperties } from \"handsontable/settings\";\nimport { editorFactory } from \"handsontable/editors\";\nimport { rendererFactory } from \"handsontable/renderers\";\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { product: \"Dashboard Pro\", category: \"Analytics\", rating: 5, reviews: 342, price: 49 },\n { product: \"Form Builder\", category: \"Tools\", rating: 4, reviews: 218, price: 29 },\n { product: \"Chart Engine\", category: \"Analytics\", rating: 3, reviews: 156, price: 39 },\n { product: \"Auth Module\", category: \"Security\", rating: 5, reviews: 89, price: 19 },\n { product: \"File Manager\", category: \"Storage\", rating: 2, reviews: 64, price: 15 },\n { product: \"Email Service\", category: \"Communication\", rating: 4, reviews: 275, price: 25 },\n { product: \"Search Index\", category: \"Tools\", rating: 1, reviews: 31, price: 35 },\n { product: \"Cache Layer\", category: \"Infra\", rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n// Get the DOM element with the ID 'example1' where the Handsontable will be rendered\nconst container = document.querySelector(\"#example1\")!;\n\nconst starSvg =\n '';\n\nconst cellDefinition: Pick<\n CellProperties,\n \"renderer\" | \"validator\" | \"editor\"\n> = {\n renderer: rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`,\n ).join(\"\")}
    `;\n }),\n validator: (value, callback) => {\n value = parseInt(value);\n callback(value >= 0 && value <= 100);\n },\n\n editor: editorFactory<{ input: HTMLDivElement }>({\n shortcuts: [\n {\n keys: [[\"1\"], [\"2\"], [\"3\"], [\"4\"], [\"5\"]],\n callback: (editor, _event) => {\n editor.setValue((_event as KeyboardEvent).key);\n },\n },\n {\n keys: [[\"ArrowRight\"]],\n callback: (editor, _event) => {\n if (parseInt(editor.value) < 5) {\n editor.setValue(parseInt(editor.value) + 1);\n }\n },\n },\n {\n keys: [[\"ArrowLeft\"]],\n callback: (editor, _event) => {\n if (parseInt(editor.value) > 1) {\n editor.setValue(parseInt(editor.value) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement(\n \"DIV\",\n ) as HTMLDivElement;\n editor.input.classList.add(\"rating-editor\");\n },\n afterInit(editor) {\n editor.input.addEventListener(\"mouseover\", (event) => {\n const star = (event.target as HTMLElement).closest(\n \".rating-star\",\n ) as HTMLElement | null;\n\n if (\n star?.dataset.value &&\n parseInt(editor.value) !== parseInt(star.dataset.value)\n ) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener(\"mousedown\", () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`,\n ).join(\"\");\n },\n }),\n};\n\n// Define configuration options for the Handsontable\nconst hotOptions: Handsontable.GridSettings = {\n data,\n colHeaders: [\"Product\", \"Category\", \"Rating\", \"Reviews\", \"Price\"],\n autoRowSize: true,\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n autoWrapRow: true,\n headerClassName: \"htLeft\",\n columns: [\n { data: \"product\", type: \"text\", width: 240 },\n { data: \"category\", type: \"text\", width: 120 },\n { data: \"rating\", width: 150, ...cellDefinition },\n { data: \"reviews\", type: \"numeric\", width: 80 },\n { data: \"price\", type: \"numeric\", width: 80 },\n ],\n licenseKey: \"non-commercial-and-evaluation\",\n};\n\n// Initialize the Handsontable instance with the specified configuration options\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/javascript/example1.ts","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__react__example1.tsx.json index 48b54b5da..d6c319d28 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__rating__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst starSvg =\n '';\n\ninterface RatingEditorInstance {\n input: HTMLDivElement;\n value: number | string;\n}\n\nconst ratingRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) => `${starSvg}`\n ).join('')}
    `;\n});\n\nconst ratingValidator = (value: unknown, callback: (valid: boolean) => void) => {\n const num = parseInt(String(value));\n\n callback(num >= 1 && num <= 5);\n};\n\nconst ratingEditor = editorFactory({\n shortcuts: [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue((_event as KeyboardEvent).key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(String(editor.value)) < 5) {\n editor.setValue(parseInt(String(editor.value)) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(String(editor.value)) > 1) {\n editor.setValue(parseInt(String(editor.value)) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('DIV') as HTMLDivElement;\n editor.input.classList.add('rating-editor');\n },\n afterInit(editor) {\n editor.input.addEventListener('mouseover', (event: MouseEvent) => {\n const star = (event.target as Element).closest('.rating-star') as HTMLElement | null;\n\n if (star?.dataset.value && parseInt(String(editor.value)) !== parseInt(star.dataset.value)) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener('mousedown', () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`\n ).join('');\n },\n});\n\n/* start:skip-in-preview */\ninterface ProductRow {\n product: string;\n category: string;\n rating: number;\n reviews: number;\n price: number;\n}\n\nconst data: ProductRow[] = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { editorFactory } from 'handsontable/editors';\nimport { rendererFactory } from 'handsontable/renderers';\nimport './example1.css';\n\nregisterAllModules();\n\nconst starSvg =\n '';\n\ninterface RatingEditorInstance {\n input: HTMLDivElement;\n value: number | string;\n}\n\nconst ratingRenderer = rendererFactory(({ td, value }) => {\n td.innerHTML = `
    ${Array.from(\n { length: 5 },\n (_, index) => `${starSvg}`\n ).join('')}
    `;\n});\n\nconst ratingValidator = (value: unknown, callback: (valid: boolean) => void) => {\n const num = parseInt(String(value));\n\n callback(num >= 1 && num <= 5);\n};\n\nconst ratingEditor = editorFactory({\n shortcuts: [\n {\n keys: [['1'], ['2'], ['3'], ['4'], ['5']],\n callback: (editor, _event) => {\n editor.setValue((_event as KeyboardEvent).key);\n },\n },\n {\n keys: [['ArrowRight']],\n callback: (editor, _event) => {\n if (parseInt(String(editor.value)) < 5) {\n editor.setValue(parseInt(String(editor.value)) + 1);\n }\n },\n },\n {\n keys: [['ArrowLeft']],\n callback: (editor, _event) => {\n if (parseInt(String(editor.value)) > 1) {\n editor.setValue(parseInt(String(editor.value)) - 1);\n }\n },\n },\n ],\n init(editor) {\n editor.input = editor.hot.rootDocument.createElement('DIV') as HTMLDivElement;\n editor.input.classList.add('rating-editor');\n },\n afterInit(editor) {\n editor.input.addEventListener('mouseover', (event: MouseEvent) => {\n const star = (event.target as Element).closest('.rating-star') as HTMLElement | null;\n\n if (star?.dataset.value && parseInt(String(editor.value)) !== parseInt(star.dataset.value)) {\n editor.setValue(star.dataset.value);\n }\n });\n editor.input.addEventListener('mousedown', () => {\n editor.finishEditing();\n });\n },\n render(editor) {\n editor.input.innerHTML = Array.from(\n { length: 5 },\n (_, index) =>\n `${starSvg}`\n ).join('');\n },\n});\n\n/* start:skip-in-preview */\ninterface ProductRow {\n product: string;\n category: string;\n rating: number;\n reviews: number;\n price: number;\n}\n\nconst data: ProductRow[] = [\n { product: 'Dashboard Pro', category: 'Analytics', rating: 5, reviews: 342, price: 49 },\n { product: 'Form Builder', category: 'Tools', rating: 4, reviews: 218, price: 29 },\n { product: 'Chart Engine', category: 'Analytics', rating: 3, reviews: 156, price: 39 },\n { product: 'Auth Module', category: 'Security', rating: 5, reviews: 89, price: 19 },\n { product: 'File Manager', category: 'Storage', rating: 2, reviews: 64, price: 15 },\n { product: 'Email Service', category: 'Communication', rating: 4, reviews: 275, price: 25 },\n { product: 'Search Index', category: 'Tools', rating: 1, reviews: 31, price: 35 },\n { product: 'Cache Layer', category: 'Infra', rating: 4, reviews: 112, price: 20 },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-star {\n color: var(--ht-background-secondary-color, #e0e0e0 );\n cursor: default;\n display: inline-flex;\n align-items: center;\n}\n\n.rating-star.active {\n color: #facc15;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n cursor: pointer;\n}\n\n.rating-editor .rating-star {\n cursor: pointer;\n}\n\n.rating-editor .rating-star.current {\n color: var(--ht-accent-color, #1a42e8);\n}"},"docsPath":"recipes/cell-types/rating/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/rating/rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/rating","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__react-rating__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__react-rating__react__example1.tsx.json index bfdc85889..adb831af3 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__react-rating__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__cell-types__react-rating__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\ninterface StarRatingProps {\n name: string;\n value: number;\n editing?: boolean;\n onStarHover?: (value: number) => void;\n onStarClick?: (value: number) => void;\n}\n\nfunction StarRating({ name, value, editing = true, onStarHover, onStarClick }: StarRatingProps) {\n return (\n
    \n {[1, 2, 3, 4, 5].map((star) => (\n onStarHover?.(star) : undefined}\n onClick={editing ? () => onStarClick?.(star) : undefined}\n >\n ★\n \n ))}\n
    \n );\n}\n\n/* start:skip-in-preview */\n\nexport const data = [\n { product: \"Dashboard Pro\", category: \"Analytics\", rating: 5, reviews: 342, price: 49 },\n { product: \"Form Builder\", category: \"Tools\", rating: 4, reviews: 218, price: 29 },\n { product: \"Chart Engine\", category: \"Analytics\", rating: 3, reviews: 156, price: 39 },\n { product: \"Auth Module\", category: \"Security\", rating: 5, reviews: 89, price: 19 },\n { product: \"File Manager\", category: \"Storage\", rating: 2, reviews: 64, price: 15 },\n { product: \"Email Service\", category: \"Communication\", rating: 4, reviews: 275, price: 25 },\n { product: \"Search Index\", category: \"Tools\", rating: 1, reviews: 31, price: 35 },\n { product: \"Cache Layer\", category: \"Infra\", rating: 4, reviews: 112, price: 20 },\n];\n\n/* end:skip-in-preview */\n\nconst RatingCellRenderer = ({ value }: { value: unknown }) => (\n
    \n \n
    \n);\n\nconst ratingValidator = (value: string | number, callback: (valid: boolean) => void) => {\n const parsed = parseInt(String(value));\n callback(parsed >= 0 && parsed <= 100);\n};\n\nexport const RatingEditor = () => {\n return (\n >\n {({ value, setValue, finishEditing }) => (\n
    \n setValue(nextValue)}\n onStarClick={(nextValue) => {\n setValue(nextValue);\n finishEditing();\n }}\n />\n
    \n )}\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".star-rating {\n display: inline-flex;\n gap: 1px;\n}\n\n.star-rating .star {\n font-size: 18px;\n color: #d3d3d3;\n line-height: 1;\n cursor: default;\n user-select: none;\n transition: color 0.1s;\n}\n\n.rating-editor .star-rating .star {\n cursor: pointer;\n}\n\n.star-rating .star.filled {\n color: #ffb400;\n}\n\n.rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: var(--ht-font-family, inherit);\n font-size: var(--ht-font-size, 14px);\n line-height: var(--ht-line-height, 1.5);\n}"},"docsPath":"recipes/cell-types/react-rating/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/react-rating/react-rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/react-rating","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Cell Types ▸ Star Rating · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable, HotColumn, EditorComponent } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\ninterface StarRatingProps {\n name: string;\n value: number;\n editing?: boolean;\n onStarHover?: (value: number) => void;\n onStarClick?: (value: number) => void;\n}\n\nfunction StarRating({ name, value, editing = true, onStarHover, onStarClick }: StarRatingProps) {\n return (\n
    \n {[1, 2, 3, 4, 5].map((star) => (\n onStarHover?.(star) : undefined}\n onClick={editing ? () => onStarClick?.(star) : undefined}\n >\n ★\n \n ))}\n
    \n );\n}\n\n/* start:skip-in-preview */\n\nexport const data = [\n { product: \"Dashboard Pro\", category: \"Analytics\", rating: 5, reviews: 342, price: 49 },\n { product: \"Form Builder\", category: \"Tools\", rating: 4, reviews: 218, price: 29 },\n { product: \"Chart Engine\", category: \"Analytics\", rating: 3, reviews: 156, price: 39 },\n { product: \"Auth Module\", category: \"Security\", rating: 5, reviews: 89, price: 19 },\n { product: \"File Manager\", category: \"Storage\", rating: 2, reviews: 64, price: 15 },\n { product: \"Email Service\", category: \"Communication\", rating: 4, reviews: 275, price: 25 },\n { product: \"Search Index\", category: \"Tools\", rating: 1, reviews: 31, price: 35 },\n { product: \"Cache Layer\", category: \"Infra\", rating: 4, reviews: 112, price: 20 },\n];\n\n/* end:skip-in-preview */\n\nconst RatingCellRenderer = ({ value }: { value: unknown }) => (\n
    \n \n
    \n);\n\nconst ratingValidator = (value: string | number, callback: (valid: boolean) => void) => {\n const parsed = parseInt(String(value));\n callback(parsed >= 0 && parsed <= 100);\n};\n\nexport const RatingEditor = () => {\n return (\n >\n {({ value, setValue, finishEditing }) => (\n
    \n setValue(nextValue)}\n onStarClick={(nextValue) => {\n setValue(nextValue);\n finishEditing();\n }}\n />\n
    \n )}\n \n );\n};\n\nconst ExampleComponent = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".star-rating {\n display: inline-flex;\n gap: 1px;\n}\n\n.star-rating .star {\n font-size: 18px;\n color: #d3d3d3;\n line-height: 1;\n cursor: default;\n user-select: none;\n transition: color 0.1s;\n}\n\n.rating-editor .star-rating .star {\n cursor: pointer;\n}\n\n.star-rating .star.filled {\n color: #ffb400;\n}\n\n.rating-cell {\n display: flex;\n align-items: center;\n margin: 3px 0 0 -1px;\n}\n\n.rating-editor {\n display: flex;\n align-items: center;\n height: 100%;\n box-sizing: border-box !important;\n border: none;\n border-radius: 0;\n box-shadow: inset 0 0 0 var(--ht-cell-editor-border-width, 2px)\n var(--ht-cell-editor-border-color, #1a42e8),\n 0 0 var(--ht-cell-editor-shadow-blur-radius, 0) 0\n var(--ht-cell-editor-shadow-color, transparent);\n background-color: var(--ht-cell-editor-background-color, #ffffff);\n padding: var(--ht-cell-vertical-padding, 4px)\n var(--ht-cell-horizontal-padding, 8px);\n font-family: var(--ht-font-family, inherit);\n font-size: var(--ht-font-size, 14px);\n line-height: var(--ht-line-height, 1.5);\n}"},"docsPath":"recipes/cell-types/react-rating/react/example1.tsx","breadcrumb":["Recipes","Cell Types","Star Rating"],"guide":"recipes/cell-types/react-rating/react-rating.md","guideTitle":"Star Rating","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/cell-types/react-rating","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__angular__example1.ts.json index d3d736c59..c57baca42 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ColumnConfig = {\n data: string;\n title: string;\n type: string;\n width: number;\n locale?: string;\n numericFormat?: Intl.NumberFormatOptions;\n dateFormat?: Intl.DateTimeFormatOptions;\n source?: string[];\n};\n\nconst allColumns: ColumnConfig[] = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-column-visibility',\n template: `\n
    \n
    \n @for (col of allColumns; track col.data; let i = $index) {\n \n }\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n readonly allColumns = allColumns;\n\n // Track which column indices are currently visible. Start with all visible.\n visibleIndices = new Set(allColumns.map((_, i) => i));\n\n gridSettings: GridSettings = {\n columns: this.getVisibleColumns(),\n colHeaders: this.getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n toggleColumn(index: number, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n\n if (!checked) {\n // Prevent hiding the last visible column.\n if (this.visibleIndices.size === 1) {\n (event.target as HTMLInputElement).checked = true;\n return;\n }\n this.visibleIndices.delete(index);\n } else {\n this.visibleIndices.add(index);\n }\n\n // Reassign to trigger Angular change detection on the template bindings.\n this.visibleIndices = new Set(this.visibleIndices);\n\n this.hotTable?.hotInstance?.updateSettings({\n columns: this.getVisibleColumns(),\n colHeaders: this.getVisibleHeaders(),\n });\n }\n\n private getVisibleColumns(): ColumnConfig[] {\n return allColumns.filter((_, i) => this.visibleIndices.has(i));\n }\n\n private getVisibleHeaders(): string[] {\n return allColumns.filter((_, i) => this.visibleIndices.has(i)).map(col => col.title);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/column-management/column-visibility/angular/example1.ts","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ColumnConfig = {\n data: string;\n title: string;\n type: string;\n width: number;\n locale?: string;\n numericFormat?: Intl.NumberFormatOptions;\n dateFormat?: Intl.DateTimeFormatOptions;\n source?: string[];\n};\n\nconst allColumns: ColumnConfig[] = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-column-visibility',\n template: `\n
    \n
    \n @for (col of allColumns; track col.data; let i = $index) {\n \n }\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n readonly allColumns = allColumns;\n\n // Track which column indices are currently visible. Start with all visible.\n visibleIndices = new Set(allColumns.map((_, i) => i));\n\n gridSettings: GridSettings = {\n columns: this.getVisibleColumns(),\n colHeaders: this.getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n toggleColumn(index: number, event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n\n if (!checked) {\n // Prevent hiding the last visible column.\n if (this.visibleIndices.size === 1) {\n (event.target as HTMLInputElement).checked = true;\n return;\n }\n this.visibleIndices.delete(index);\n } else {\n this.visibleIndices.add(index);\n }\n\n // Reassign to trigger Angular change detection on the template bindings.\n this.visibleIndices = new Set(this.visibleIndices);\n\n this.hotTable?.hotInstance?.updateSettings({\n columns: this.getVisibleColumns(),\n colHeaders: this.getVisibleHeaders(),\n });\n }\n\n private getVisibleColumns(): ColumnConfig[] {\n return allColumns.filter((_, i) => this.visibleIndices.has(i));\n }\n\n private getVisibleHeaders(): string[] {\n return allColumns.filter((_, i) => this.visibleIndices.has(i)).map(col => col.title);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/column-management/column-visibility/angular/example1.ts","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.js.json index 2676ca020..9a572ca61 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n// Track which column indices (into allColumns) are currently visible.\n// Start with all columns visible.\nconst visibleIndices = new Set(allColumns.map((_, i) => i));\n// Returns only the column configs that are currently visible.\nfunction getVisibleColumns() {\n return allColumns.filter((_, i) => visibleIndices.has(i));\n}\n// Returns only the column headers that are currently visible.\nfunction getVisibleHeaders() {\n return allColumns.filter((_, i) => visibleIndices.has(i)).map(col => col.title);\n}\nconst rootContainer = document.querySelector('#example1');\n// Inject the toolbar and the grid mount point inside #example1.\n// Avoids container.before() which requires #example1 to have a parent node.\nrootContainer.innerHTML = `\n
    \n
    \n`;\nconst container = rootContainer.querySelector('.column-visibility-grid');\nconst togglesContainer = rootContainer.querySelector('.controls');\nconst hot = new Handsontable(container, {\n data,\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Build a checkbox for each column and attach toggle logic.\nallColumns.forEach((col, index) => {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = true; // all columns are visible on load\n checkbox.dataset.colIndex = String(index);\n checkbox.addEventListener('change', () => {\n if (!checkbox.checked) {\n // Prevent hiding the last visible column.\n if (visibleIndices.size === 1) {\n checkbox.checked = true;\n return;\n }\n visibleIndices.delete(index);\n }\n else {\n visibleIndices.add(index);\n }\n // Apply the new visible subset. hot.updateSettings() re-renders the grid\n // with only the provided columns config -- no DOM manipulation needed.\n hot.updateSettings({\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n });\n // When only one column remains visible, disable its checkbox so the user\n // cannot produce an empty grid.\n togglesContainer.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\n const idx = Number(cb.dataset.colIndex);\n cb.disabled = visibleIndices.size === 1 && visibleIndices.has(idx);\n });\n });\n label.appendChild(checkbox);\n label.appendChild(document.createTextNode(col.title));\n togglesContainer.appendChild(label);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/column-management/column-visibility/javascript/example1.js","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n// Track which column indices (into allColumns) are currently visible.\n// Start with all columns visible.\nconst visibleIndices = new Set(allColumns.map((_, i) => i));\n// Returns only the column configs that are currently visible.\nfunction getVisibleColumns() {\n return allColumns.filter((_, i) => visibleIndices.has(i));\n}\n// Returns only the column headers that are currently visible.\nfunction getVisibleHeaders() {\n return allColumns.filter((_, i) => visibleIndices.has(i)).map(col => col.title);\n}\nconst rootContainer = document.querySelector('#example1');\n// Inject the toolbar and the grid mount point inside #example1.\n// Avoids container.before() which requires #example1 to have a parent node.\nrootContainer.innerHTML = `\n
    \n
    \n`;\nconst container = rootContainer.querySelector('.column-visibility-grid');\nconst togglesContainer = rootContainer.querySelector('.controls');\nconst hot = new Handsontable(container, {\n data,\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n// Build a checkbox for each column and attach toggle logic.\nallColumns.forEach((col, index) => {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = true; // all columns are visible on load\n checkbox.dataset.colIndex = String(index);\n checkbox.addEventListener('change', () => {\n if (!checkbox.checked) {\n // Prevent hiding the last visible column.\n if (visibleIndices.size === 1) {\n checkbox.checked = true;\n return;\n }\n visibleIndices.delete(index);\n }\n else {\n visibleIndices.add(index);\n }\n // Apply the new visible subset. hot.updateSettings() re-renders the grid\n // with only the provided columns config -- no DOM manipulation needed.\n hot.updateSettings({\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n });\n // When only one column remains visible, disable its checkbox so the user\n // cannot produce an empty grid.\n togglesContainer.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\n const idx = Number(cb.dataset.colIndex);\n cb.disabled = visibleIndices.size === 1 && visibleIndices.has(idx);\n });\n });\n label.appendChild(checkbox);\n label.appendChild(document.createTextNode(col.title));\n togglesContainer.appendChild(label);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/column-management/column-visibility/javascript/example1.js","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.ts.json index 999f488d3..db3dfd918 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\n// Track which column indices (into allColumns) are currently visible.\n// Start with all columns visible.\nconst visibleIndices = new Set(allColumns.map((_, i) => i));\n\n// Returns only the column configs that are currently visible.\nfunction getVisibleColumns() {\n return allColumns.filter((_, i) => visibleIndices.has(i));\n}\n\n// Returns only the column headers that are currently visible.\nfunction getVisibleHeaders() {\n return allColumns.filter((_, i) => visibleIndices.has(i)).map(col => col.title);\n}\n\nconst rootContainer = document.querySelector('#example1')!;\n\n// Inject the toolbar and the grid mount point inside #example1.\n// Avoids container.before() which requires #example1 to have a parent node.\nrootContainer.innerHTML = `\n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('.column-visibility-grid')!;\nconst togglesContainer = rootContainer.querySelector('.controls')!;\n\nconst hot = new Handsontable(container, {\n data,\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Build a checkbox for each column and attach toggle logic.\n\nallColumns.forEach((col, index) => {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n\n checkbox.type = 'checkbox';\n checkbox.checked = true; // all columns are visible on load\n checkbox.dataset.colIndex = String(index);\n\n checkbox.addEventListener('change', () => {\n if (!checkbox.checked) {\n // Prevent hiding the last visible column.\n if (visibleIndices.size === 1) {\n checkbox.checked = true;\n return;\n }\n visibleIndices.delete(index);\n } else {\n visibleIndices.add(index);\n }\n\n // Apply the new visible subset. hot.updateSettings() re-renders the grid\n // with only the provided columns config -- no DOM manipulation needed.\n hot.updateSettings({\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n });\n\n // When only one column remains visible, disable its checkbox so the user\n // cannot produce an empty grid.\n togglesContainer.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\n const idx = Number((cb as HTMLInputElement).dataset.colIndex);\n\n (cb as HTMLInputElement).disabled = visibleIndices.size === 1 && visibleIndices.has(idx);\n });\n });\n\n label.appendChild(checkbox);\n label.appendChild(document.createTextNode(col.title));\n togglesContainer.appendChild(label);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/column-management/column-visibility/javascript/example1.ts","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\n// Track which column indices (into allColumns) are currently visible.\n// Start with all columns visible.\nconst visibleIndices = new Set(allColumns.map((_, i) => i));\n\n// Returns only the column configs that are currently visible.\nfunction getVisibleColumns() {\n return allColumns.filter((_, i) => visibleIndices.has(i));\n}\n\n// Returns only the column headers that are currently visible.\nfunction getVisibleHeaders() {\n return allColumns.filter((_, i) => visibleIndices.has(i)).map(col => col.title);\n}\n\nconst rootContainer = document.querySelector('#example1')!;\n\n// Inject the toolbar and the grid mount point inside #example1.\n// Avoids container.before() which requires #example1 to have a parent node.\nrootContainer.innerHTML = `\n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('.column-visibility-grid')!;\nconst togglesContainer = rootContainer.querySelector('.controls')!;\n\nconst hot = new Handsontable(container, {\n data,\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Build a checkbox for each column and attach toggle logic.\n\nallColumns.forEach((col, index) => {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n\n checkbox.type = 'checkbox';\n checkbox.checked = true; // all columns are visible on load\n checkbox.dataset.colIndex = String(index);\n\n checkbox.addEventListener('change', () => {\n if (!checkbox.checked) {\n // Prevent hiding the last visible column.\n if (visibleIndices.size === 1) {\n checkbox.checked = true;\n return;\n }\n visibleIndices.delete(index);\n } else {\n visibleIndices.add(index);\n }\n\n // Apply the new visible subset. hot.updateSettings() re-renders the grid\n // with only the provided columns config -- no DOM manipulation needed.\n hot.updateSettings({\n columns: getVisibleColumns(),\n colHeaders: getVisibleHeaders(),\n });\n\n // When only one column remains visible, disable its checkbox so the user\n // cannot produce an empty grid.\n togglesContainer.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\n const idx = Number((cb as HTMLInputElement).dataset.colIndex);\n\n (cb as HTMLInputElement).disabled = visibleIndices.size === 1 && visibleIndices.has(idx);\n });\n });\n\n label.appendChild(checkbox);\n label.appendChild(document.createTextNode(col.title));\n togglesContainer.appendChild(label);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/column-management/column-visibility/javascript/example1.ts","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__react__example1.tsx.json index 2a311336e..371d10ee7 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__column-visibility__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useMemo, useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype EmployeeRow = {\n name: string;\n department: string;\n role: string;\n salary: number;\n startDate: string;\n location: string;\n status: string;\n};\n\nconst data: EmployeeRow[] = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns: (ColumnSettings & { title: string })[] = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\nconst ExampleComponent = () => {\n // Track which column indices (into allColumns) are currently visible.\n // Start with all columns visible.\n const [visibleIndices, setVisibleIndices] = useState>(\n () => new Set(allColumns.map((_, i) => i))\n );\n\n const handleToggle = useCallback((index: number) => {\n setVisibleIndices((prev) => {\n // Prevent hiding the last visible column.\n if (prev.has(index) && prev.size === 1) {\n return prev;\n }\n\n const next = new Set(prev);\n\n if (prev.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n\n return next;\n });\n }, []);\n\n const columns = useMemo(\n (): ColumnSettings[] => allColumns.filter((_, i) => visibleIndices.has(i)),\n [visibleIndices]\n );\n const colHeaders = useMemo(\n (): string[] => allColumns.filter((_, i) => visibleIndices.has(i)).map((col) => col.title),\n [visibleIndices]\n );\n\n return (\n <>\n
    \n
    \n {allColumns.map((col, index) => (\n \n ))}\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/column-management/column-visibility/react/example1.tsx","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Column Management ▸ Build a dynamic column visibility toggle · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useMemo, useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype EmployeeRow = {\n name: string;\n department: string;\n role: string;\n salary: number;\n startDate: string;\n location: string;\n status: string;\n};\n\nconst data: EmployeeRow[] = [\n { name: 'Alice Johnson', department: 'Engineering', role: 'Senior Engineer', salary: 95000, startDate: '2019-03-12', location: 'New York', status: 'Active' },\n { name: 'Bob Martinez', department: 'Marketing', role: 'Marketing Manager', salary: 78000, startDate: '2020-07-01', location: 'Chicago', status: 'Active' },\n { name: 'Carol Lee', department: 'Engineering', role: 'Tech Lead', salary: 115000, startDate: '2017-11-15', location: 'San Francisco', status: 'Active' },\n { name: 'David Kim', department: 'HR', role: 'HR Specialist', salary: 65000, startDate: '2021-02-28', location: 'Austin', status: 'On Leave' },\n { name: 'Eva Novak', department: 'Finance', role: 'Financial Analyst', salary: 82000, startDate: '2018-09-03', location: 'New York', status: 'Active' },\n { name: 'Frank Chen', department: 'Engineering', role: 'Junior Engineer', salary: 72000, startDate: '2022-05-16', location: 'Seattle', status: 'Active' },\n { name: 'Grace Okafor', department: 'Sales', role: 'Sales Executive', salary: 70000, startDate: '2020-01-20', location: 'Dallas', status: 'Active' },\n { name: 'Henry Walsh', department: 'Finance', role: 'Finance Director', salary: 130000, startDate: '2015-06-10', location: 'Chicago', status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// The full columns config is the immutable source of truth.\n// Never mutate this array -- always derive a visible subset from it.\nconst allColumns: (ColumnSettings & { title: string })[] = [\n { data: 'name', title: 'Name', type: 'text', width: 140 },\n { data: 'department', title: 'Department', type: 'text', width: 120 },\n { data: 'role', title: 'Role', type: 'text', width: 150 },\n {\n data: 'salary',\n title: 'Salary',\n type: 'numeric',\n locale: 'en-US',\n numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 },\n width: 110,\n },\n { data: 'startDate', title: 'Start Date', type: 'intl-date', locale: 'en-CA', dateFormat: { dateStyle: 'short' }, width: 120 },\n { data: 'location', title: 'Location', type: 'text', width: 120 },\n {\n data: 'status',\n title: 'Status',\n type: 'dropdown',\n source: ['Active', 'On Leave', 'Inactive'],\n width: 120,\n },\n];\n\nconst ExampleComponent = () => {\n // Track which column indices (into allColumns) are currently visible.\n // Start with all columns visible.\n const [visibleIndices, setVisibleIndices] = useState>(\n () => new Set(allColumns.map((_, i) => i))\n );\n\n const handleToggle = useCallback((index: number) => {\n setVisibleIndices((prev) => {\n // Prevent hiding the last visible column.\n if (prev.has(index) && prev.size === 1) {\n return prev;\n }\n\n const next = new Set(prev);\n\n if (prev.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n\n return next;\n });\n }, []);\n\n const columns = useMemo(\n (): ColumnSettings[] => allColumns.filter((_, i) => visibleIndices.has(i)),\n [visibleIndices]\n );\n const colHeaders = useMemo(\n (): string[] => allColumns.filter((_, i) => visibleIndices.has(i)).map((col) => col.title),\n [visibleIndices]\n );\n\n return (\n <>\n
    \n
    \n {allColumns.map((col, index) => (\n \n ))}\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/column-management/column-visibility/react/example1.tsx","breadcrumb":["Recipes","Column Management","Build a dynamic column visibility toggle"],"guide":"recipes/column-management/column-visibility/column-visibility.md","guideTitle":"Build a dynamic column visibility toggle","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/column-visibility","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__angular__example1.ts.json index 37bb6cd61..34ea20269 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\ntype CampaignRow = {\n campaign: string;\n channel: string;\n impressions: number;\n clicks: number;\n conversions: number;\n cpc: number;\n revenue: number;\n roi: number;\n};\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-freeze-columns',\n template: `\n
    \n
    \n @for (header of colHeaders; track header; let i = $index) {\n \n }\n
    \n
    \n \n {{ statusText }}\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n readonly colHeaders = colHeaders;\n\n frozenCount = 0;\n\n get statusText(): string {\n return this.frozenCount === 0\n ? 'No columns frozen'\n : `${this.frozenCount} column${this.frozenCount > 1 ? 's' : ''} frozen`;\n }\n\n readonly gridSettings: GridSettings = {\n colHeaders,\n columns: [\n { data: 'campaign', type: 'text' },\n { data: 'channel', type: 'text' },\n { data: 'impressions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n fixedColumnsStart: 0,\n manualColumnMove: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n freezeUpTo(n: number): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n const total = hot.countCols();\n\n this.frozenCount = Math.min(n, total);\n hot.updateSettings({ fixedColumnsStart: this.frozenCount });\n }\n\n unfreezeAll(): void {\n this.frozenCount = 0;\n this.hotTable?.hotInstance?.updateSettings({ fixedColumnsStart: 0 });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/angular/example1.ts","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\ntype CampaignRow = {\n campaign: string;\n channel: string;\n impressions: number;\n clicks: number;\n conversions: number;\n cpc: number;\n revenue: number;\n roi: number;\n};\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-freeze-columns',\n template: `\n
    \n
    \n @for (header of colHeaders; track header; let i = $index) {\n \n }\n
    \n
    \n \n {{ statusText }}\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n readonly colHeaders = colHeaders;\n\n frozenCount = 0;\n\n get statusText(): string {\n return this.frozenCount === 0\n ? 'No columns frozen'\n : `${this.frozenCount} column${this.frozenCount > 1 ? 's' : ''} frozen`;\n }\n\n readonly gridSettings: GridSettings = {\n colHeaders,\n columns: [\n { data: 'campaign', type: 'text' },\n { data: 'channel', type: 'text' },\n { data: 'impressions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n fixedColumnsStart: 0,\n manualColumnMove: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n };\n\n freezeUpTo(n: number): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n const total = hot.countCols();\n\n this.frozenCount = Math.min(n, total);\n hot.updateSettings({ fixedColumnsStart: this.frozenCount });\n }\n\n unfreezeAll(): void {\n this.frozenCount = 0;\n this.hotTable?.hotInstance?.updateSettings({ fixedColumnsStart: 0 });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/angular/example1.ts","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__javascript__example1.js.json index 46b80a250..172dd6e57 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\n// Number of columns currently frozen. Starts at 0 (no frozen columns).\nlet frozenCount = 0;\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\nconst container = document.querySelector('#example1');\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\n\nconst freezeRow = document.createElement('div');\n\nfreezeRow.className = 'controls';\n\nconst unfreezeRow = document.createElement('div');\n\nunfreezeRow.className = 'controls';\n\nconst statusEl = document.createElement('span');\n\nstatusEl.className = 'freeze-status';\n\ntoolbar.appendChild(freezeRow);\ntoolbar.appendChild(unfreezeRow);\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders,\n columns: [\n { data: 'campaign', type: 'text' },\n { data: 'channel', type: 'text' },\n { data: 'impressions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n fixedColumnsStart: 0,\n manualColumnMove: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Updates the status indicator to reflect the current frozen column count.\nfunction updateStatus() {\n statusEl.textContent = frozenCount === 0\n ? 'No columns frozen'\n : `${frozenCount} column${frozenCount > 1 ? 's' : ''} frozen`;\n}\n\n// Applies the freeze boundary and refreshes the status indicator.\nfunction freezeUpTo(n) {\n const total = hot.countCols();\n\n // Guard: clamp to the number of columns actually present in the grid.\n frozenCount = Math.min(n, total);\n hot.updateSettings({ fixedColumnsStart: frozenCount });\n updateStatus();\n}\n\n// Generates one \"Freeze up to column N\" button for each column.\ncolHeaders.forEach((header, index) => {\n const btn = document.createElement('button');\n\n btn.type = 'button';\n btn.textContent = `Freeze up to \"${header}\"`;\n\n btn.addEventListener('click', () => {\n freezeUpTo(index + 1);\n });\n\n freezeRow.appendChild(btn);\n});\n\n// \"Unfreeze all\" resets fixedColumnsStart to 0.\nconst unfreezeBtn = document.createElement('button');\n\nunfreezeBtn.type = 'button';\nunfreezeBtn.textContent = 'Unfreeze all';\n\nunfreezeBtn.addEventListener('click', () => {\n frozenCount = 0;\n hot.updateSettings({ fixedColumnsStart: 0 });\n updateStatus();\n});\n\nunfreezeRow.appendChild(unfreezeBtn);\nunfreezeRow.appendChild(statusEl);\n\nupdateStatus();","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/javascript/example1.js","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\n// Number of columns currently frozen. Starts at 0 (no frozen columns).\nlet frozenCount = 0;\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\nconst container = document.querySelector('#example1');\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\n\nconst freezeRow = document.createElement('div');\n\nfreezeRow.className = 'controls';\n\nconst unfreezeRow = document.createElement('div');\n\nunfreezeRow.className = 'controls';\n\nconst statusEl = document.createElement('span');\n\nstatusEl.className = 'freeze-status';\n\ntoolbar.appendChild(freezeRow);\ntoolbar.appendChild(unfreezeRow);\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders,\n columns: [\n { data: 'campaign', type: 'text' },\n { data: 'channel', type: 'text' },\n { data: 'impressions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n fixedColumnsStart: 0,\n manualColumnMove: true,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Updates the status indicator to reflect the current frozen column count.\nfunction updateStatus() {\n statusEl.textContent = frozenCount === 0\n ? 'No columns frozen'\n : `${frozenCount} column${frozenCount > 1 ? 's' : ''} frozen`;\n}\n\n// Applies the freeze boundary and refreshes the status indicator.\nfunction freezeUpTo(n) {\n const total = hot.countCols();\n\n // Guard: clamp to the number of columns actually present in the grid.\n frozenCount = Math.min(n, total);\n hot.updateSettings({ fixedColumnsStart: frozenCount });\n updateStatus();\n}\n\n// Generates one \"Freeze up to column N\" button for each column.\ncolHeaders.forEach((header, index) => {\n const btn = document.createElement('button');\n\n btn.type = 'button';\n btn.textContent = `Freeze up to \"${header}\"`;\n\n btn.addEventListener('click', () => {\n freezeUpTo(index + 1);\n });\n\n freezeRow.appendChild(btn);\n});\n\n// \"Unfreeze all\" resets fixedColumnsStart to 0.\nconst unfreezeBtn = document.createElement('button');\n\nunfreezeBtn.type = 'button';\nunfreezeBtn.textContent = 'Unfreeze all';\n\nunfreezeBtn.addEventListener('click', () => {\n frozenCount = 0;\n hot.updateSettings({ fixedColumnsStart: 0 });\n updateStatus();\n});\n\nunfreezeRow.appendChild(unfreezeBtn);\nunfreezeRow.appendChild(statusEl);\n\nupdateStatus();","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/javascript/example1.js","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__react__example1.tsx.json index 8ce30977b..ec7f1bd5a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__column-management__freeze-columns__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef, useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { HotTableRef } from '@handsontable/react-wrapper';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype CampaignRow = {\n campaign: string;\n channel: string;\n impressions: number;\n clicks: number;\n conversions: number;\n cpc: number;\n revenue: number;\n roi: number;\n};\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\nconst columns = [\n { data: 'campaign', type: 'text' as const },\n { data: 'channel', type: 'text' as const },\n { data: 'impressions', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric' as const, numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric' as const, numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric' as const, numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [frozenCount, setFrozenCount] = useState(0);\n\n const freezeUpTo = useCallback((n: number) => {\n const hot = hotRef.current?.hotInstance;\n const total = hot ? hot.countCols() : colHeaders.length;\n\n setFrozenCount(Math.min(n, total));\n }, []);\n\n const unfreezeAll = useCallback(() => {\n setFrozenCount(0);\n }, []);\n\n const statusText = frozenCount === 0\n ? 'No columns frozen'\n : `${frozenCount} column${frozenCount > 1 ? 's' : ''} frozen`;\n\n return (\n <>\n
    \n
    \n {colHeaders.map((header, index) => (\n freezeUpTo(index + 1)}\n >\n Freeze up to "{header}"\n \n ))}\n
    \n
    \n \n {statusText}\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/react/example1.tsx","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Column Management ▸ Freeze and unfreeze columns at runtime · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef, useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { HotTableRef } from '@handsontable/react-wrapper';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype CampaignRow = {\n campaign: string;\n channel: string;\n impressions: number;\n clicks: number;\n conversions: number;\n cpc: number;\n revenue: number;\n roi: number;\n};\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale', channel: 'Email', impressions: 120000, clicks: 4800, conversions: 320, cpc: 0.42, revenue: 9600, roi: 2.28 },\n { campaign: 'Summer Push', channel: 'Paid Search', impressions: 85000, clicks: 3100, conversions: 210, cpc: 1.15, revenue: 6300, roi: 1.82 },\n { campaign: 'Back to School', channel: 'Social', impressions: 200000, clicks: 7200, conversions: 540, cpc: 0.31, revenue: 16200, roi: 3.10 },\n { campaign: 'Black Friday', channel: 'Display', impressions: 450000, clicks: 9000, conversions: 720, cpc: 0.65, revenue: 28800, roi: 2.94 },\n { campaign: 'Holiday Deals', channel: 'Email', impressions: 310000, clicks: 11200, conversions: 890, cpc: 0.28, revenue: 35600, roi: 4.12 },\n { campaign: 'New Year Offer', channel: 'Paid Search', impressions: 95000, clicks: 3800, conversions: 290, cpc: 1.22, revenue: 8700, roi: 1.65 },\n { campaign: 'Valentine Push', channel: 'Social', impressions: 140000, clicks: 5600, conversions: 410, cpc: 0.38, revenue: 12300, roi: 2.56 },\n { campaign: 'Spring Relaunch', channel: 'Display', impressions: 175000, clicks: 6300, conversions: 480, cpc: 0.55, revenue: 14400, roi: 2.18 },\n];\n/* end:skip-in-preview */\n\nconst colHeaders = ['Campaign', 'Channel', 'Impressions', 'Clicks', 'Conversions', 'CPC ($)', 'Revenue ($)', 'ROI'];\n\nconst columns = [\n { data: 'campaign', type: 'text' as const },\n { data: 'channel', type: 'text' as const },\n { data: 'impressions', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'clicks', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'conversions', type: 'numeric' as const, numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'cpc', type: 'numeric' as const, numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'revenue', type: 'numeric' as const, numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 } },\n { data: 'roi', type: 'numeric' as const, numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [frozenCount, setFrozenCount] = useState(0);\n\n const freezeUpTo = useCallback((n: number) => {\n const hot = hotRef.current?.hotInstance;\n const total = hot ? hot.countCols() : colHeaders.length;\n\n setFrozenCount(Math.min(n, total));\n }, []);\n\n const unfreezeAll = useCallback(() => {\n setFrozenCount(0);\n }, []);\n\n const statusText = frozenCount === 0\n ? 'No columns frozen'\n : `${frozenCount} column${frozenCount > 1 ? 's' : ''} frozen`;\n\n return (\n <>\n
    \n
    \n {colHeaders.map((header, index) => (\n freezeUpTo(index + 1)}\n >\n Freeze up to "{header}"\n \n ))}\n
    \n
    \n \n {statusText}\n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".example-controls-container .controls + .controls {\n margin-top: 0.5rem;\n}\n\n.freeze-controls__freeze-btns {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n\n.freeze-controls__footer {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.freeze-controls button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 0;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.freeze-controls button:hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.freeze-controls button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.freeze-controls__status {\n font-size: var(--sl-text-sm, 0.875rem);\n font-style: italic;\n color: var(--sl-color-gray-2, #555555);\n}"},"docsPath":"recipes/column-management/freeze-columns/react/example1.tsx","breadcrumb":["Recipes","Column Management","Freeze and unfreeze columns at runtime"],"guide":"recipes/column-management/freeze-columns/freeze-columns.md","guideTitle":"Freeze and unfreeze columns at runtime","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/column-management/freeze-columns","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__angular__example1.ts.json index 0f47cba7d..cbc780006 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\ntype ColumnConfig = { data: string; width: number; className?: string };\n\n// `columns` and `colHeaders` are kept in mutable variables so the custom menu\n// item can extend them and push the change back through `updateSettings`.\nconst columns: ColumnConfig[] = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-add-column-object-data',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Handsontable.RowObject[] = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders,\n columns,\n height: 'auto',\n width: '100%',\n contextMenu: {\n items: {\n add_column: {\n name: 'Add column',\n callback: (_key: string, selection: Array<{ start: { col: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n (hot.getSourceData() as Array>).forEach((row) => {\n row[newKey] = '';\n });\n\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: { name: '---------' },\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\ntype ColumnConfig = { data: string; width: number; className?: string };\n\n// `columns` and `colHeaders` are kept in mutable variables so the custom menu\n// item can extend them and push the change back through `updateSettings`.\nconst columns: ColumnConfig[] = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-add-column-object-data',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Handsontable.RowObject[] = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders,\n columns,\n height: 'auto',\n width: '100%',\n contextMenu: {\n items: {\n add_column: {\n name: 'Add column',\n callback: (_key: string, selection: Array<{ start: { col: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n (hot.getSourceData() as Array>).forEach((row) => {\n row[newKey] = '';\n });\n\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: { name: '---------' },\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__javascript__example1.js.json index 7a2dea987..6be0e2c0b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\n// `columns` and `colHeaders` are kept in mutable variables so the custom menu\n// item can extend them and push the change back through `updateSettings`.\nconst columns = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders,\n columns,\n height: 'auto',\n width: '100%',\n contextMenu: {\n items: {\n // Object data blocks the built-in `col_left` / `col_right` items, so a\n // custom action does the work instead.\n add_column: {\n name: 'Add column',\n callback(key, selection) {\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n // 1. Add the new property to every source row object.\n hot.getSourceData().forEach((row) => {\n row[newKey] = '';\n });\n\n // 2. Extend the `columns` and `colHeaders` arrays at the clicked position.\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n // 3. Apply the new structure.\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: '---------',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\n// `columns` and `colHeaders` are kept in mutable variables so the custom menu\n// item can extend them and push the change back through `updateSettings`.\nconst columns = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders,\n columns,\n height: 'auto',\n width: '100%',\n contextMenu: {\n items: {\n // Object data blocks the built-in `col_left` / `col_right` items, so a\n // custom action does the work instead.\n add_column: {\n name: 'Add column',\n callback(key, selection) {\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n // 1. Add the new property to every source row object.\n hot.getSourceData().forEach((row) => {\n row[newKey] = '';\n });\n\n // 2. Extend the `columns` and `colHeaders` arrays at the clicked position.\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n // 3. Apply the new structure.\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: '---------',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__react__example1.tsx.json index 734443fe9..803508b52 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__add-column-object-data__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\ntype ColumnConfig = { data: string; width: number; className?: string };\n\n// `columns` and `colHeaders` live outside the component so the custom menu item\n// can extend them and push the change back through `updateSettings`.\nconst columns: ColumnConfig[] = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n ) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n (hot.getSourceData() as Array>).forEach((row) => {\n row[newKey] = '';\n });\n\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: '---------',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Add a column to an object-based dataset · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-4821', supplier: 'Harbor Goods', stock: 142, category: 'Electronics' },\n { sku: 'SKU-0093', supplier: 'Alpine Supply Co.', stock: 0, category: 'Apparel' },\n { sku: 'SKU-7311', supplier: 'Meadow Foods', stock: 67, category: 'Grocery' },\n { sku: 'SKU-2250', supplier: 'Harbor Goods', stock: 318, category: 'Electronics' },\n { sku: 'SKU-9047', supplier: 'Northwind Traders', stock: 12, category: 'Hardware' },\n { sku: 'SKU-6638', supplier: 'Alpine Supply Co.', stock: 205, category: 'Apparel' },\n];\n/* end:skip-in-preview */\n\ntype ColumnConfig = { data: string; width: number; className?: string };\n\n// `columns` and `colHeaders` live outside the component so the custom menu item\n// can extend them and push the change back through `updateSettings`.\nconst columns: ColumnConfig[] = [\n { data: 'sku', width: 120 },\n { data: 'supplier', width: 170 },\n { data: 'stock', width: 90 },\n { data: 'category', width: 130 },\n];\nconst colHeaders = ['SKU', 'Supplier', 'Stock', 'Category'];\n\nlet newColumnCount = 0;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n ) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const insertAt = selection[0].start.col + 1;\n\n newColumnCount += 1;\n const newKey = `custom_${newColumnCount}`;\n\n (hot.getSourceData() as Array>).forEach((row) => {\n row[newKey] = '';\n });\n\n columns.splice(insertAt, 0, { data: newKey, width: 130, className: 'ht-new-column' });\n colHeaders.splice(insertAt, 0, `Custom ${newColumnCount}`);\n\n hot.updateSettings({ columns, colHeaders });\n },\n },\n sep1: '---------',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"td.ht-new-column {\n background-color: #e3f2fd;\n}"},"docsPath":"recipes/context-menu/add-column-object-data/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Add a column to an object-based dataset"],"guide":"recipes/context-menu/add-column-object-data/add-column-object-data.md","guideTitle":"Add a column to an object-based dataset","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/add-column-object-data","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__angular__example1.ts.json index ce50875e0..ad3f957ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-custom-context-menu',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Handsontable.RowObject[] = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Task', 'Assignee', 'Status', 'Priority', 'Due Date'],\n columns: [\n { data: 'task', width: 200 },\n { data: 'assignee', width: 130 },\n { data: 'status', width: 110 },\n { data: 'priority', width: 90 },\n { data: 'dueDate', width: 110 },\n ],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n cells(row: number) {\n if (flaggedRows.has(row)) {\n return { className: 'ht-flagged-row' };\n }\n return {};\n },\n contextMenu: {\n items: {\n duplicate_row: {\n name: 'Duplicate row',\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row)) as Record;\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name: (): string => {\n const row = this.hotTable?.hotInstance?.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row as number) ? 'Unflag row' : 'Flag row';\n },\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n sep1: { name: '---------' },\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: { name: '---------' },\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-custom-context-menu',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: Handsontable.RowObject[] = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Task', 'Assignee', 'Status', 'Priority', 'Due Date'],\n columns: [\n { data: 'task', width: 200 },\n { data: 'assignee', width: 130 },\n { data: 'status', width: 110 },\n { data: 'priority', width: 90 },\n { data: 'dueDate', width: 110 },\n ],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n cells(row: number) {\n if (flaggedRows.has(row)) {\n return { className: 'ht-flagged-row' };\n }\n return {};\n },\n contextMenu: {\n items: {\n duplicate_row: {\n name: 'Duplicate row',\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row)) as Record;\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name: (): string => {\n const row = this.hotTable?.hotInstance?.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row as number) ? 'Unflag row' : 'Flag row';\n },\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback: (_key: string, selection: Array<{ start: { row: number } }>) => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n sep1: { name: '---------' },\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: { name: '---------' },\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__javascript__example1.js.json index 8028058a8..3ecc86f5a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Task', 'Assignee', 'Status', 'Priority', 'Due Date'],\n columns: [\n { data: 'task', width: 200 },\n { data: 'assignee', width: 130 },\n { data: 'status', width: 110 },\n { data: 'priority', width: 90 },\n { data: 'dueDate', width: 110 },\n ],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n // The `cells` callback runs for every cell and lets you attach per-row metadata.\n // Returning `className: 'ht-flagged-row'` for flagged rows makes the CSS rule apply.\n cells(row) {\n if (flaggedRows.has(row)) {\n return { className: 'ht-flagged-row' };\n }\n },\n contextMenu: {\n items: {\n // --- Custom actions ---\n duplicate_row: {\n name: 'Duplicate row',\n callback(key, selection) {\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name() {\n const row = this.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row) ? 'Unflag row' : 'Flag row';\n },\n callback(key, selection) {\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback(key, selection) {\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n // --- Separator between custom and built-in items ---\n sep1: '-',\n // --- Built-in items (col_left and col_right are omitted) ---\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: '-',\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n rowHeaders: true,\n colHeaders: ['Task', 'Assignee', 'Status', 'Priority', 'Due Date'],\n columns: [\n { data: 'task', width: 200 },\n { data: 'assignee', width: 130 },\n { data: 'status', width: 110 },\n { data: 'priority', width: 90 },\n { data: 'dueDate', width: 110 },\n ],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n // The `cells` callback runs for every cell and lets you attach per-row metadata.\n // Returning `className: 'ht-flagged-row'` for flagged rows makes the CSS rule apply.\n cells(row) {\n if (flaggedRows.has(row)) {\n return { className: 'ht-flagged-row' };\n }\n },\n contextMenu: {\n items: {\n // --- Custom actions ---\n duplicate_row: {\n name: 'Duplicate row',\n callback(key, selection) {\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name() {\n const row = this.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row) ? 'Unflag row' : 'Flag row';\n },\n callback(key, selection) {\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback(key, selection) {\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n // --- Separator between custom and built-in items ---\n sep1: '-',\n // --- Built-in items (col_left and col_right are omitted) ---\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: '-',\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__react__example1.tsx.json index d5bb53647..8e5190ca4 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__custom-context-menu__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n ) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row)) as Record;\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name() {\n const row = hotRef.current?.hotInstance?.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row as number) ? 'Unflag row' : 'Flag row';\n },\n callback(_key: string, selection: Array<{ start: { row: number } }>) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback(_key: string, selection: Array<{ start: { row: number } }>) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n sep1: '-',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: '-',\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Custom context menu actions · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Deploy API v2', assignee: 'Alice Chen', status: 'In Progress', priority: 'High', dueDate: '2026-05-10' },\n { task: 'Write unit tests', assignee: 'Bob Smith', status: 'To Do', priority: 'Medium', dueDate: '2026-05-15' },\n { task: 'Review PR #142', assignee: 'Carol Davis', status: 'Done', priority: 'Low', dueDate: '2026-04-30' },\n { task: 'Fix login timeout', assignee: 'David Lee', status: 'In Progress', priority: 'High', dueDate: '2026-05-08' },\n { task: 'Update SSL certs', assignee: 'Eve Martin', status: 'To Do', priority: 'Urgent', dueDate: '2026-05-01' },\n { task: 'Migrate DB schema', assignee: 'Frank Wang', status: 'To Do', priority: 'High', dueDate: '2026-05-20' },\n { task: 'Refactor auth module', assignee: 'Grace Kim', status: 'In Progress', priority: 'Medium', dueDate: '2026-05-25' },\n { task: 'Load test staging', assignee: 'Henry Park', status: 'To Do', priority: 'Low', dueDate: '2026-06-01' },\n];\n/* end:skip-in-preview */\n\nconst flaggedRows = new Set();\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n return (\n ) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row)) as Record;\n\n hot.alter('insert_row_below', row, 1);\n hot.populateFromArray(row + 1, 0, [Object.values(rowData)]);\n },\n },\n flag_row: {\n name() {\n const row = hotRef.current?.hotInstance?.getSelectedRangeLast()?.from.row;\n\n return flaggedRows.has(row as number) ? 'Unflag row' : 'Flag row';\n },\n callback(_key: string, selection: Array<{ start: { row: number } }>) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n\n if (flaggedRows.has(row)) {\n flaggedRows.delete(row);\n } else {\n flaggedRows.add(row);\n }\n\n hot.render();\n },\n },\n copy_row_as_json: {\n name: 'Copy row as JSON',\n callback(_key: string, selection: Array<{ start: { row: number } }>) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n\n const row = selection[0].start.row;\n const rowData = hot.getSourceDataAtRow(hot.toPhysicalRow(row));\n\n navigator.clipboard.writeText(JSON.stringify(rowData));\n },\n },\n sep1: '-',\n row_above: { name: 'Insert row above' },\n row_below: { name: 'Insert row below' },\n remove_row: { name: 'Remove row' },\n sep2: '-',\n undo: { name: 'Undo' },\n redo: { name: 'Redo' },\n },\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"td.ht-flagged-row {\n background-color: #fff9c4 !important;\n}"},"docsPath":"recipes/context-menu/custom-context-menu/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Custom context menu actions"],"guide":"recipes/context-menu/custom-context-menu/custom-context-menu.md","guideTitle":"Custom context menu actions","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/custom-context-menu","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__angular__example1.ts.json index 74a9882f5..58f2818ed 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst INITIAL_DATA: string[][] = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-row-operations',\n template: `\n
    \n
    \n \n \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('toolbar', { static: true }) readonly toolbarRef!: ElementRef;\n\n readonly hotData: string[][] = [...INITIAL_DATA];\n\n selectedRow: number | null = null;\n\n get isLastRow(): boolean {\n const hot = this.hotTable?.hotInstance;\n\n return hot ? this.selectedRow === hot.countRows() - 1 : false;\n }\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's click handler runs.\n outsideClickDeselects: (target: HTMLElement) => {\n return !this.toolbarRef?.nativeElement?.contains(target);\n },\n afterSelectionEnd: (row: number, _col: number, row2: number) => {\n this.selectedRow = row === row2 ? Math.min(row, row2) : null;\n },\n afterDeselect: () => {\n this.selectedRow = null;\n },\n };\n\n addRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.alter('insert_row_below', hot.countRows() - 1);\n }\n\n deleteRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n // Delete from bottom to top so earlier indices stay valid\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach((row) => hot.alter('remove_row', row, 1));\n }\n\n moveUp(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (this.selectedRow === null || this.selectedRow === 0 || !hot) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(this.selectedRow, this.selectedRow - 1);\n hot.render();\n this.selectedRow -= 1;\n hot.selectRows(this.selectedRow);\n }\n\n moveDown(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (this.selectedRow === null || !hot || this.selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(this.selectedRow, this.selectedRow + 2);\n hot.render();\n this.selectedRow += 1;\n hot.selectRows(this.selectedRow);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/context-menu/row-operations/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\nconst INITIAL_DATA: string[][] = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-row-operations',\n template: `\n
    \n
    \n \n \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('toolbar', { static: true }) readonly toolbarRef!: ElementRef;\n\n readonly hotData: string[][] = [...INITIAL_DATA];\n\n selectedRow: number | null = null;\n\n get isLastRow(): boolean {\n const hot = this.hotTable?.hotInstance;\n\n return hot ? this.selectedRow === hot.countRows() - 1 : false;\n }\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's click handler runs.\n outsideClickDeselects: (target: HTMLElement) => {\n return !this.toolbarRef?.nativeElement?.contains(target);\n },\n afterSelectionEnd: (row: number, _col: number, row2: number) => {\n this.selectedRow = row === row2 ? Math.min(row, row2) : null;\n },\n afterDeselect: () => {\n this.selectedRow = null;\n },\n };\n\n addRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.alter('insert_row_below', hot.countRows() - 1);\n }\n\n deleteRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n // Delete from bottom to top so earlier indices stay valid\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach((row) => hot.alter('remove_row', row, 1));\n }\n\n moveUp(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (this.selectedRow === null || this.selectedRow === 0 || !hot) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(this.selectedRow, this.selectedRow - 1);\n hot.render();\n this.selectedRow -= 1;\n hot.selectRows(this.selectedRow);\n }\n\n moveDown(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (this.selectedRow === null || !hot || this.selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(this.selectedRow, this.selectedRow + 2);\n hot.render();\n this.selectedRow += 1;\n hot.selectRows(this.selectedRow);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/context-menu/row-operations/angular/example1.ts","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.js.json index 670e4d337..269b1d2d4 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\ntoolbar.innerHTML = `\n
    \n \n \n \n \n
    \n`;\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's click handler runs.\n outsideClickDeselects(target) {\n return !toolbar.contains(target);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst btnAddRow = toolbar.querySelector('#btn-add-row');\nconst btnDeleteRow = toolbar.querySelector('#btn-delete-row');\nconst btnMoveUp = toolbar.querySelector('#btn-move-up');\nconst btnMoveDown = toolbar.querySelector('#btn-move-down');\n\nlet selectedRow = null;\n\nfunction updateButtonStates() {\n const hasSelection = selectedRow !== null;\n const isFirst = selectedRow === 0;\n const isLast = selectedRow === hot.countRows() - 1;\n\n btnDeleteRow.disabled = !hasSelection;\n btnMoveUp.disabled = !hasSelection || isFirst;\n btnMoveDown.disabled = !hasSelection || isLast;\n}\n\nhot.addHook('afterSelectionEnd', (row, col, row2) => {\n selectedRow = row === row2 ? Math.min(row, row2) : null;\n updateButtonStates();\n});\n\nhot.addHook('afterDeselect', () => {\n selectedRow = null;\n updateButtonStates();\n});\n\nbtnAddRow.addEventListener('click', () => {\n hot.alter('insert_row_below', hot.countRows() - 1);\n});\n\nbtnDeleteRow.addEventListener('click', () => {\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach(row => hot.alter('remove_row', row, 1));\n updateButtonStates();\n});\n\nbtnMoveUp.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === 0) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n selectedRow -= 1;\n hot.selectRows(selectedRow);\n});\n\n// ManualRowMove inserts BEFORE the target index, so moving row N down\n// requires a target of N + 2 (the slot after the next row).\nbtnMoveDown.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n selectedRow += 1;\n hot.selectRows(selectedRow);\n});\n\nupdateButtonStates();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/context-menu/row-operations/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\ntoolbar.innerHTML = `\n
    \n \n \n \n \n
    \n`;\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's click handler runs.\n outsideClickDeselects(target) {\n return !toolbar.contains(target);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst btnAddRow = toolbar.querySelector('#btn-add-row');\nconst btnDeleteRow = toolbar.querySelector('#btn-delete-row');\nconst btnMoveUp = toolbar.querySelector('#btn-move-up');\nconst btnMoveDown = toolbar.querySelector('#btn-move-down');\n\nlet selectedRow = null;\n\nfunction updateButtonStates() {\n const hasSelection = selectedRow !== null;\n const isFirst = selectedRow === 0;\n const isLast = selectedRow === hot.countRows() - 1;\n\n btnDeleteRow.disabled = !hasSelection;\n btnMoveUp.disabled = !hasSelection || isFirst;\n btnMoveDown.disabled = !hasSelection || isLast;\n}\n\nhot.addHook('afterSelectionEnd', (row, col, row2) => {\n selectedRow = row === row2 ? Math.min(row, row2) : null;\n updateButtonStates();\n});\n\nhot.addHook('afterDeselect', () => {\n selectedRow = null;\n updateButtonStates();\n});\n\nbtnAddRow.addEventListener('click', () => {\n hot.alter('insert_row_below', hot.countRows() - 1);\n});\n\nbtnDeleteRow.addEventListener('click', () => {\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach(row => hot.alter('remove_row', row, 1));\n updateButtonStates();\n});\n\nbtnMoveUp.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === 0) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n selectedRow -= 1;\n hot.selectRows(selectedRow);\n});\n\n// ManualRowMove inserts BEFORE the target index, so moving row N down\n// requires a target of N + 2 (the slot after the next row).\nbtnMoveDown.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n selectedRow += 1;\n hot.selectRows(selectedRow);\n});\n\nupdateButtonStates();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/context-menu/row-operations/javascript/example1.js","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.ts.json index 10b24e38b..5626927d8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\ntoolbar.innerHTML = `\n
    \n \n \n \n \n
    \n`;\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n outsideClickDeselects(target: HTMLElement) {\n return !toolbar.contains(target);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst btnAddRow = toolbar.querySelector('#btn-add-row') as HTMLButtonElement;\nconst btnDeleteRow = toolbar.querySelector('#btn-delete-row') as HTMLButtonElement;\nconst btnMoveUp = toolbar.querySelector('#btn-move-up') as HTMLButtonElement;\nconst btnMoveDown = toolbar.querySelector('#btn-move-down') as HTMLButtonElement;\n\nlet selectedRow: number | null = null;\n\nfunction updateButtonStates(): void {\n const hasSelection = selectedRow !== null;\n const isFirst = selectedRow === 0;\n const isLast = selectedRow === hot.countRows() - 1;\n\n btnDeleteRow.disabled = !hasSelection;\n btnMoveUp.disabled = !hasSelection || isFirst;\n btnMoveDown.disabled = !hasSelection || isLast;\n}\n\nhot.addHook('afterSelectionEnd', (row: number, _col: number, row2: number) => {\n selectedRow = row === row2 ? Math.min(row, row2) : null;\n updateButtonStates();\n});\n\nhot.addHook('afterDeselect', () => {\n selectedRow = null;\n updateButtonStates();\n});\n\nbtnAddRow.addEventListener('click', () => {\n hot.alter('insert_row_below', hot.countRows() - 1);\n});\n\nbtnDeleteRow.addEventListener('click', () => {\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach(row => hot.alter('remove_row', row, 1));\n updateButtonStates();\n});\n\nbtnMoveUp.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === 0) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n selectedRow -= 1;\n hot.selectRows(selectedRow);\n});\n\n// ManualRowMove inserts BEFORE the target index, so moving row N down\n// requires a target of N + 2 (the slot after the next row).\nbtnMoveDown.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n selectedRow += 1;\n hot.selectRows(selectedRow);\n});\n\nupdateButtonStates();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/context-menu/row-operations/javascript/example1.ts","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\n\nconst toolbar = document.createElement('div');\n\ntoolbar.classList.add('example-controls-container');\ntoolbar.innerHTML = `\n
    \n \n \n \n \n
    \n`;\ncontainer.before(toolbar);\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Task', 'Assignee', 'Priority', 'Status'],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n manualRowMove: true,\n outsideClickDeselects(target: HTMLElement) {\n return !toolbar.contains(target);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst btnAddRow = toolbar.querySelector('#btn-add-row') as HTMLButtonElement;\nconst btnDeleteRow = toolbar.querySelector('#btn-delete-row') as HTMLButtonElement;\nconst btnMoveUp = toolbar.querySelector('#btn-move-up') as HTMLButtonElement;\nconst btnMoveDown = toolbar.querySelector('#btn-move-down') as HTMLButtonElement;\n\nlet selectedRow: number | null = null;\n\nfunction updateButtonStates(): void {\n const hasSelection = selectedRow !== null;\n const isFirst = selectedRow === 0;\n const isLast = selectedRow === hot.countRows() - 1;\n\n btnDeleteRow.disabled = !hasSelection;\n btnMoveUp.disabled = !hasSelection || isFirst;\n btnMoveDown.disabled = !hasSelection || isLast;\n}\n\nhot.addHook('afterSelectionEnd', (row: number, _col: number, row2: number) => {\n selectedRow = row === row2 ? Math.min(row, row2) : null;\n updateButtonStates();\n});\n\nhot.addHook('afterDeselect', () => {\n selectedRow = null;\n updateButtonStates();\n});\n\nbtnAddRow.addEventListener('click', () => {\n hot.alter('insert_row_below', hot.countRows() - 1);\n});\n\nbtnDeleteRow.addEventListener('click', () => {\n const selected = hot.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach(row => hot.alter('remove_row', row, 1));\n updateButtonStates();\n});\n\nbtnMoveUp.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === 0) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n selectedRow -= 1;\n hot.selectRows(selectedRow);\n});\n\n// ManualRowMove inserts BEFORE the target index, so moving row N down\n// requires a target of N + 2 (the slot after the next row).\nbtnMoveDown.addEventListener('click', () => {\n if (selectedRow === null || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n selectedRow += 1;\n hot.selectRows(selectedRow);\n});\n\nupdateButtonStates();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/context-menu/row-operations/javascript/example1.ts","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__react__example1.tsx.json index 4219694ae..046d0db1e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__context-menu__row-operations__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst INITIAL_DATA: string[][] = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [selectedRow, setSelectedRow] = useState(null);\n\n const getHot = () => hotRef.current?.hotInstance;\n\n const isFirst = selectedRow === 0;\n const isLast =\n selectedRow !== null && !!getHot() && selectedRow === (getHot()?.countRows() ?? 0) - 1;\n\n const handleAddRow = (): void => {\n const hot = getHot();\n\n if (!hot) {\n return;\n }\n\n hot.alter('insert_row_below', hot.countRows() - 1);\n };\n\n const handleDeleteRow = (): void => {\n const hot = getHot();\n const selected = hot?.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n // Delete from bottom to top so earlier indices stay valid\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach((row) => hot.alter('remove_row', row, 1));\n };\n\n const handleMoveUp = (): void => {\n const hot = getHot();\n\n if (selectedRow === null || selectedRow === 0 || !hot) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n const newRow = selectedRow - 1;\n\n hot.selectRows(newRow);\n setSelectedRow(newRow);\n };\n\n const handleMoveDown = (): void => {\n const hot = getHot();\n\n if (selectedRow === null || !hot || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n const newRow = selectedRow + 1;\n\n hot.selectRows(newRow);\n setSelectedRow(newRow);\n };\n\n const handleSelectionEnd = (row: number, _col: number, row2: number): void => {\n setSelectedRow(row === row2 ? row : null);\n };\n\n const handleDeselect = (): void => {\n setSelectedRow(null);\n };\n\n const toolbarRef = useRef(null);\n\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's onClick handler runs.\n const outsideClickDeselects = (target: HTMLElement): boolean => {\n return !toolbarRef.current?.contains(target);\n };\n\n return (\n <>\n
    \n
    \n \n \n \n \n Move Down\n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/context-menu/row-operations/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Context Menu ▸ Programmatic row operations · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst INITIAL_DATA: string[][] = [\n ['Migrate auth service to OAuth 2.0', 'Alice Johnson', 'High', 'In Progress'],\n ['Write API documentation', 'Bob Smith', 'Normal', 'To Do'],\n ['Fix pagination bug on dashboard', 'Carol White', 'High', 'In Review'],\n ['Add CSV export feature', 'David Lee', 'Normal', 'To Do'],\n ['Upgrade React to v19', 'Eve Martinez', 'Low', 'Backlog'],\n ['Implement dark mode toggle', 'Frank Brown', 'Normal', 'In Progress'],\n ['Set up end-to-end test suite', 'Grace Kim', 'High', 'To Do'],\n ['Refactor database connection pool', 'Henry Wilson', 'Low', 'Backlog'],\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [selectedRow, setSelectedRow] = useState(null);\n\n const getHot = () => hotRef.current?.hotInstance;\n\n const isFirst = selectedRow === 0;\n const isLast =\n selectedRow !== null && !!getHot() && selectedRow === (getHot()?.countRows() ?? 0) - 1;\n\n const handleAddRow = (): void => {\n const hot = getHot();\n\n if (!hot) {\n return;\n }\n\n hot.alter('insert_row_below', hot.countRows() - 1);\n };\n\n const handleDeleteRow = (): void => {\n const hot = getHot();\n const selected = hot?.getSelected();\n\n if (!selected) {\n return;\n }\n\n const rowSet = new Set();\n\n selected.forEach(([r1, , r2]) => {\n const from = Math.min(r1, r2);\n const to = Math.max(r1, r2);\n\n for (let r = from; r <= to; r++) {\n rowSet.add(r);\n }\n });\n\n // Delete from bottom to top so earlier indices stay valid\n const rows = [...rowSet].sort((a, b) => b - a);\n\n rows.forEach((row) => hot.alter('remove_row', row, 1));\n };\n\n const handleMoveUp = (): void => {\n const hot = getHot();\n\n if (selectedRow === null || selectedRow === 0 || !hot) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow - 1);\n hot.render();\n const newRow = selectedRow - 1;\n\n hot.selectRows(newRow);\n setSelectedRow(newRow);\n };\n\n const handleMoveDown = (): void => {\n const hot = getHot();\n\n if (selectedRow === null || !hot || selectedRow === hot.countRows() - 1) {\n return;\n }\n\n hot.getPlugin('manualRowMove').moveRow(selectedRow, selectedRow + 2);\n hot.render();\n const newRow = selectedRow + 1;\n\n hot.selectRows(newRow);\n setSelectedRow(newRow);\n };\n\n const handleSelectionEnd = (row: number, _col: number, row2: number): void => {\n setSelectedRow(row === row2 ? row : null);\n };\n\n const handleDeselect = (): void => {\n setSelectedRow(null);\n };\n\n const toolbarRef = useRef(null);\n\n // Keep the grid selected when clicking toolbar buttons. Without this,\n // Handsontable treats toolbar clicks as outside clicks and deselects,\n // which clears selectedRow before the button's onClick handler runs.\n const outsideClickDeselects = (target: HTMLElement): boolean => {\n return !toolbarRef.current?.contains(target);\n };\n\n return (\n <>\n
    \n
    \n \n \n \n \n Move Down\n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/context-menu/row-operations/react/example1.tsx","breadcrumb":["Recipes","Context Menu","Programmatic row operations"],"guide":"recipes/context-menu/row-operations/row-operations.md","guideTitle":"Programmatic row operations","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/context-menu/row-operations","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__angular__example1.ts.json index f1d92c97b..db273447f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ntype RowData = {\n id: number;\n product: string;\n stock: number;\n price: number;\n status: 'active' | 'draft' | 'paused';\n};\n\ntype SaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nconst STATUS_LABELS: Record = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-auto-save-backend',\n template: `\n
    \n
    \n {{ statusLabel }}\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n saveStatus: SaveStatus = 'idle';\n\n /** Nothing marks the OnPush-by-default component dirty here, so mark it. */\n private setSaveStatus(status: SaveStatus): void {\n this.saveStatus = status;\n this.cdr.markForCheck();\n }\n\n get statusLabel(): string {\n return STATUS_LABELS[this.saveStatus];\n }\n\n readonly hotData: RowData[] = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n ];\n\n private dirtyRows = new Set();\n private saveTimeout: ReturnType | null = null;\n private saveRequestCounter = 0;\n\n private saveRowsToBackend(rows: RowData[]): Promise {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n }\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (!changes || source === 'loadData') {\n return;\n }\n\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow as number);\n\n if (physicalRow !== null && physicalRow >= 0) {\n this.dirtyRows.add(physicalRow);\n }\n }\n });\n\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(this.dirtyRows);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++this.saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row): row is RowData => row !== undefined && row !== null);\n\n this.dirtyRows.clear();\n this.setSaveStatus('saving');\n\n void this.saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => this.dirtyRows.add(physicalRow));\n\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/angular/example1.ts","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ntype RowData = {\n id: number;\n product: string;\n stock: number;\n price: number;\n status: 'active' | 'draft' | 'paused';\n};\n\ntype SaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nconst STATUS_LABELS: Record = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-auto-save-backend',\n template: `\n
    \n
    \n {{ statusLabel }}\n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n saveStatus: SaveStatus = 'idle';\n\n /** Nothing marks the OnPush-by-default component dirty here, so mark it. */\n private setSaveStatus(status: SaveStatus): void {\n this.saveStatus = status;\n this.cdr.markForCheck();\n }\n\n get statusLabel(): string {\n return STATUS_LABELS[this.saveStatus];\n }\n\n readonly hotData: RowData[] = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n ];\n\n private dirtyRows = new Set();\n private saveTimeout: ReturnType | null = null;\n private saveRequestCounter = 0;\n\n private saveRowsToBackend(rows: RowData[]): Promise {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n }\n\n readonly hotSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (!changes || source === 'loadData') {\n return;\n }\n\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow as number);\n\n if (physicalRow !== null && physicalRow >= 0) {\n this.dirtyRows.add(physicalRow);\n }\n }\n });\n\n if (this.saveTimeout) {\n clearTimeout(this.saveTimeout);\n }\n\n this.saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(this.dirtyRows);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++this.saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row): row is RowData => row !== undefined && row !== null);\n\n this.dirtyRows.clear();\n this.setSaveStatus('saving');\n\n void this.saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => this.dirtyRows.add(physicalRow));\n\n if (requestId === this.saveRequestCounter) {\n this.setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/angular/example1.ts","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.js.json index 1cc186ff0..15b31f1e5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n\nconst data = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\nconst rootContainer = document.querySelector('#example1');\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const statusEl = document.createElement('span');\n const gridContainer = document.createElement('div');\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n statusEl.className = 'auto-save-backend-status';\n toolbar.appendChild(controls);\n controls.appendChild(statusEl);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n const dirtyRows = new Set();\n let saveTimeout = null;\n let saveRequestCounter = 0;\n const setSaveStatus = (state) => {\n const labels = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n };\n statusEl.textContent = labels[state];\n statusEl.dataset.state = state;\n };\n const saveRowsToBackend = (rows) => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n };\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(changes, source) {\n if (!changes || source === 'loadData') {\n return;\n }\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow);\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRows.add(physicalRow);\n }\n }\n });\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(dirtyRows);\n if (physicalRows.length === 0) {\n return;\n }\n const requestId = ++saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row) => row !== null);\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n return;\n }\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row) => row !== undefined && row !== null);\n dirtyRows.clear();\n setSaveStatus('saving');\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounter) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRows.add(physicalRow));\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n });\n // Demonstrate that loadData updates do not trigger save requests.\n hot.loadData(data.map((row) => ({ ...row })));\n setSaveStatus('idle');\n}","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/javascript/example1.js","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n\nconst data = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\nconst rootContainer = document.querySelector('#example1');\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const statusEl = document.createElement('span');\n const gridContainer = document.createElement('div');\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n statusEl.className = 'auto-save-backend-status';\n toolbar.appendChild(controls);\n controls.appendChild(statusEl);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n const dirtyRows = new Set();\n let saveTimeout = null;\n let saveRequestCounter = 0;\n const setSaveStatus = (state) => {\n const labels = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n };\n statusEl.textContent = labels[state];\n statusEl.dataset.state = state;\n };\n const saveRowsToBackend = (rows) => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n };\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(changes, source) {\n if (!changes || source === 'loadData') {\n return;\n }\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow);\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRows.add(physicalRow);\n }\n }\n });\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(dirtyRows);\n if (physicalRows.length === 0) {\n return;\n }\n const requestId = ++saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row) => row !== null);\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n return;\n }\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row) => row !== undefined && row !== null);\n dirtyRows.clear();\n setSaveStatus('saving');\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounter) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRows.add(physicalRow));\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n });\n // Demonstrate that loadData updates do not trigger save requests.\n hot.loadData(data.map((row) => ({ ...row })));\n setSaveStatus('idle');\n}","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/javascript/example1.js","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.ts.json index 4a5e3eaf2..2fdc2c5c8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype RowData = {\n id: number;\n product: string;\n stock: number;\n price: number;\n status: 'active' | 'draft' | 'paused';\n};\n\nconst data: RowData[] = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\n\nconst rootContainer = document.querySelector('#example1');\n\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const statusEl = document.createElement('span');\n const gridContainer = document.createElement('div');\n\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n statusEl.className = 'auto-save-backend-status';\n\n toolbar.appendChild(controls);\n controls.appendChild(statusEl);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n\n const dirtyRows = new Set();\n let saveTimeout: ReturnType | null = null;\n let saveRequestCounter = 0;\n\n const setSaveStatus = (state: 'idle' | 'saving' | 'saved' | 'error') => {\n const labels = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n };\n\n statusEl.textContent = labels[state];\n statusEl.dataset.state = state;\n };\n\n const saveRowsToBackend = (rows: RowData[]): Promise => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n };\n\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(changes, source) {\n if (!changes || source === 'loadData') {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow as number);\n\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRows.add(physicalRow);\n }\n }\n });\n\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n\n saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(dirtyRows);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row): row is RowData => row !== undefined && row !== null);\n\n dirtyRows.clear();\n setSaveStatus('saving');\n\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounter) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRows.add(physicalRow));\n\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n });\n\n // Demonstrate that loadData updates do not trigger save requests.\n hot.loadData(data.map((row) => ({ ...row })));\n setSaveStatus('idle');\n}","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype RowData = {\n id: number;\n product: string;\n stock: number;\n price: number;\n status: 'active' | 'draft' | 'paused';\n};\n\nconst data: RowData[] = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\n\nconst rootContainer = document.querySelector('#example1');\n\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const statusEl = document.createElement('span');\n const gridContainer = document.createElement('div');\n\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n statusEl.className = 'auto-save-backend-status';\n\n toolbar.appendChild(controls);\n controls.appendChild(statusEl);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n\n const dirtyRows = new Set();\n let saveTimeout: ReturnType | null = null;\n let saveRequestCounter = 0;\n\n const setSaveStatus = (state: 'idle' | 'saving' | 'saved' | 'error') => {\n const labels = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n };\n\n statusEl.textContent = labels[state];\n statusEl.dataset.state = state;\n };\n\n const saveRowsToBackend = (rows: RowData[]): Promise => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n };\n\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Product', 'Stock', 'Price', 'Status'],\n columns: [\n { data: 'id', type: 'numeric', readOnly: true, width: 70 },\n { data: 'product', type: 'text', width: 180 },\n { data: 'stock', type: 'numeric', width: 90 },\n { data: 'price', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n { data: 'status', type: 'text', width: 120 },\n ],\n stretchH: 'all',\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n afterChange(changes, source) {\n if (!changes || source === 'loadData') {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow as number);\n\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRows.add(physicalRow);\n }\n }\n });\n\n if (saveTimeout) {\n clearTimeout(saveTimeout);\n }\n\n saveTimeout = setTimeout(() => {\n const physicalRows = Array.from(dirtyRows);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++saveRequestCounter;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row): row is RowData => row !== undefined && row !== null);\n\n dirtyRows.clear();\n setSaveStatus('saving');\n\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounter) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRows.add(physicalRow));\n\n if (requestId === saveRequestCounter) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n },\n });\n\n // Demonstrate that loadData updates do not trigger save requests.\n hot.loadData(data.map((row) => ({ ...row })));\n setSaveStatus('idle');\n}","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__react__example1.tsx.json index bf1d64166..17343c6a4 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__auto-save-backend__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\n\ntype SaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nconst statusLabels: Record = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n};\n\nconst saveRowsToBackend = (rows: unknown[]): Promise => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [saveStatus, setSaveStatus] = useState('idle');\n const dirtyRowsRef = useRef(new Set());\n const saveTimeoutRef = useRef | null>(null);\n const saveRequestCounterRef = useRef(0);\n\n const handleAfterChange = (\n changes: [number, string | number, unknown, unknown][] | null,\n source: string\n ): void => {\n if (!changes || source === 'loadData') {\n return;\n }\n\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow);\n\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRowsRef.current.add(physicalRow);\n }\n }\n });\n\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current);\n }\n\n saveTimeoutRef.current = setTimeout(() => {\n const physicalRows = Array.from(dirtyRowsRef.current);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++saveRequestCounterRef.current;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row) => row !== undefined && row !== null);\n\n dirtyRowsRef.current.clear();\n setSaveStatus('saving');\n\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRowsRef.current.add(physicalRow));\n\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n };\n\n return (\n
    \n
    \n
    \n \n {statusLabels[saveStatus]}\n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/react/example1.tsx","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Auto-save changes to a backend · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst data = [\n { id: 1, product: 'Keyboard', stock: 14, price: 89, status: 'active' },\n { id: 2, product: 'Monitor', stock: 5, price: 249, status: 'active' },\n { id: 3, product: 'Dock', stock: 22, price: 139, status: 'draft' },\n { id: 4, product: 'Webcam', stock: 9, price: 119, status: 'active' },\n { id: 5, product: 'Headset', stock: 16, price: 99, status: 'paused' },\n];\n\ntype SaveStatus = 'idle' | 'saving' | 'saved' | 'error';\n\nconst statusLabels: Record = {\n idle: 'No pending changes',\n saving: 'Saving...',\n saved: 'Saved ✓',\n error: 'Error',\n};\n\nconst saveRowsToBackend = (rows: unknown[]): Promise => {\n return new Promise((resolve) => setTimeout(resolve, 450)).then(() => {\n // Replace this with fetch('/api/products', { method: 'PATCH', body: ... }) in production.\n // eslint-disable-next-line no-console\n console.log('PATCH /api/products', rows);\n });\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [saveStatus, setSaveStatus] = useState('idle');\n const dirtyRowsRef = useRef(new Set());\n const saveTimeoutRef = useRef | null>(null);\n const saveRequestCounterRef = useRef(0);\n\n const handleAfterChange = (\n changes: [number, string | number, unknown, unknown][] | null,\n source: string\n ): void => {\n if (!changes || source === 'loadData') {\n return;\n }\n\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([visualRow, _prop, oldValue, newValue]) => {\n if (oldValue !== newValue) {\n const physicalRow = hot.toPhysicalRow(visualRow);\n\n if (physicalRow !== null && physicalRow >= 0) {\n dirtyRowsRef.current.add(physicalRow);\n }\n }\n });\n\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current);\n }\n\n saveTimeoutRef.current = setTimeout(() => {\n const physicalRows = Array.from(dirtyRowsRef.current);\n\n if (physicalRows.length === 0) {\n return;\n }\n\n const requestId = ++saveRequestCounterRef.current;\n const visualRows = physicalRows\n .map((physicalRow) => hot.toVisualRow(physicalRow))\n .filter((row): row is number => row !== null);\n\n hot.validateRows(visualRows, (valid) => {\n if (!valid) {\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('error');\n }\n\n return;\n }\n\n const rowsToSave = physicalRows\n .map((physicalRow) => hot.getSourceDataAtRow(physicalRow))\n .filter((row) => row !== undefined && row !== null);\n\n dirtyRowsRef.current.clear();\n setSaveStatus('saving');\n\n void saveRowsToBackend(rowsToSave)\n .then(() => {\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('saved');\n }\n })\n .catch(() => {\n physicalRows.forEach((physicalRow) => dirtyRowsRef.current.add(physicalRow));\n\n if (requestId === saveRequestCounterRef.current) {\n setSaveStatus('error');\n }\n });\n });\n }, 800);\n };\n\n return (\n
    \n
    \n
    \n \n {statusLabels[saveStatus]}\n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":".auto-save-backend-status {\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 600;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.auto-save-backend-status[data-state=\"saving\"] {\n color: var(--sl-color-blue, #2856ea);\n}\n\n.auto-save-backend-status[data-state=\"saved\"] {\n color: var(--sl-color-green, #16a34a);\n}\n\n.auto-save-backend-status[data-state=\"error\"] {\n color: var(--sl-color-red, #ef4444);\n}"},"docsPath":"recipes/data-management/auto-save-backend/react/example1.tsx","breadcrumb":["Recipes","Data Management","Auto-save changes to a backend"],"guide":"recipes/data-management/auto-save-backend/auto-save-backend.md","guideTitle":"Auto-save changes to a backend","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/auto-save-backend","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example1.ts.json index 30e14c634..f4e0d7676 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-load-data-graphql',\n template: `\n
    \n
    \n @if (hasError) {\n \n }\n
    \n {{ status }}\n
    \n \n `,\n})\nexport class AppComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n status = 'Loading users...';\n hasError = false;\n rows: UserRow[] = [];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n ngOnInit(): void {\n this.loadUsers();\n }\n\n async loadUsers(): Promise {\n this.status = 'Loading users...';\n this.hasError = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.rows = this.mapUsersToGridRows(users);\n this.status = 'Loaded users from GraphQL API.';\n } catch (_error) {\n this.rows = [];\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n }\n\n private mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-graphql/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-load-data-graphql',\n template: `\n
    \n
    \n @if (hasError) {\n \n }\n
    \n {{ status }}\n
    \n \n `,\n})\nexport class AppComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n status = 'Loading users...';\n hasError = false;\n rows: UserRow[] = [];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n ngOnInit(): void {\n this.loadUsers();\n }\n\n async loadUsers(): Promise {\n this.status = 'Loading users...';\n this.hasError = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.rows = this.mapUsersToGridRows(users);\n this.status = 'Loaded users from GraphQL API.';\n } catch (_error) {\n this.rows = [];\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n }\n\n private mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-graphql/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example2.ts.json index 65292698b..a9cac5112 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-load-data-graphql',\n template: `\n
    \n
    \n @if (showRefresh && !hasError) {\n \n }\n @if (hasError) {\n \n }\n
    \n {{ status }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n status = 'Loading users...';\n hasError = false;\n showRefresh = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n ngAfterViewInit(): void {\n this.initialLoad();\n }\n\n // Step 5: Initial load uses loadData() directly on the hot instance, which resets all grid states.\n // This is correct for a first load -- there is no existing state to preserve.\n async initialLoad(): Promise {\n this.status = 'Loading users...';\n this.hasError = false;\n this.showRefresh = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.loadData(this.mapUsersToGridRows(users));\n this.status =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\n this.showRefresh = true;\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n // Step 6: Subsequent refreshes use updateData(), which replaces the data\n // without resetting column sort order, selection, or column order.\n async refreshUsers(): Promise {\n this.status = 'Refreshing...';\n this.hasError = false;\n this.showRefresh = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.updateData(this.mapUsersToGridRows(users));\n this.status = 'Data refreshed -- column sort order was preserved.';\n this.showRefresh = true;\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n }\n\n private mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-graphql/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-load-data-graphql',\n template: `\n
    \n
    \n @if (showRefresh && !hasError) {\n \n }\n @if (hasError) {\n \n }\n
    \n {{ status }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n status = 'Loading users...';\n hasError = false;\n showRefresh = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n ngAfterViewInit(): void {\n this.initialLoad();\n }\n\n // Step 5: Initial load uses loadData() directly on the hot instance, which resets all grid states.\n // This is correct for a first load -- there is no existing state to preserve.\n async initialLoad(): Promise {\n this.status = 'Loading users...';\n this.hasError = false;\n this.showRefresh = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.loadData(this.mapUsersToGridRows(users));\n this.status =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\n this.showRefresh = true;\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n // Step 6: Subsequent refreshes use updateData(), which replaces the data\n // without resetting column sort order, selection, or column order.\n async refreshUsers(): Promise {\n this.status = 'Refreshing...';\n this.hasError = false;\n this.showRefresh = false;\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.updateData(this.mapUsersToGridRows(users));\n this.status = 'Data refreshed -- column sort order was preserved.';\n this.showRefresh = true;\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n this.hasError = true;\n this.status = 'Failed to load users. Try again.';\n } finally {\n // Nothing marks the OnPush-by-default component dirty after an `await`, so mark it.\n this.cdr.markForCheck();\n }\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n }\n\n private mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-graphql/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.js.json index 413dd14e5..2f2f1041a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function fetchUsers() {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = await response.json();\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function fetchUsers() {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = await response.json();\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.ts.json index 15444a6d8..b54fd866b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.js.json index b8012acfa..fcf186ddd 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers() {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = await response.json();\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers() {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = await response.json();\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.ts.json index b61fb70b5..54ec291ed 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared GraphQL helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: {\n users?: {\n data?: ApiUser[];\n };\n };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared GraphQL helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: {\n users?: {\n data?: ApiUser[];\n };\n };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-graphql/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example1.tsx.json index ce5eb25b1..60e12b556 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const [rows, setRows] = useState([]);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n\n const loadUsers = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n\n try {\n const users = await fetchUsers();\n\n setRows(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n } catch (_error) {\n setRows([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { loadUsers(); }, []);\n\n return (\n
    \n
    \n
    \n {hasError && (\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-graphql/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from GraphQL API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const [rows, setRows] = useState([]);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n\n const loadUsers = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n\n try {\n const users = await fetchUsers();\n\n setRows(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n } catch (_error) {\n setRows([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { loadUsers(); }, []);\n\n return (\n
    \n
    \n
    \n {hasError && (\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-graphql/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-graphql","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example2.tsx.json index ab7964707..9a1d21904 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-graphql__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const hotRef = useRef>(null);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n const [showRefresh, setShowRefresh] = useState(false);\n\n // Step 5: Initial load uses loadData() via the hot instance, which resets all grid states.\n const initialLoad = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.loadData(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n setShowRefresh(true);\n } catch (_error) {\n hotRef.current?.hotInstance?.loadData([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // Step 6: Subsequent refreshes use updateData(), which replaces the data\n // without resetting column sort order, selection, or column order.\n const refreshUsers = async () => {\n setStatus(STATUS_REFRESHING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.updateData(mapUsersToGridRows(users));\n setStatus(STATUS_REFRESHED);\n setShowRefresh(true);\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { initialLoad(); }, []);\n\n return (\n
    \n
    \n
    \n {showRefresh && !hasError && (\n \n Refresh\n \n )}\n {hasError && (\n \n Retry\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-graphql/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a GraphQL API · Using updateData() to preserve sorting and other states · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst USERS_QUERY = `\n query {\n users {\n data {\n id\n name\n username\n email\n address {\n city\n }\n company {\n name\n }\n }\n }\n }\n`;\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://graphqlzero.almansi.me/api', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ query: USERS_QUERY }),\n });\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const payload = (await response.json()) as {\n data?: { users?: { data?: ApiUser[] } };\n errors?: Array<{ message?: string }>;\n };\n\n // GraphQL APIs can return HTTP 200 and still include execution errors.\n if (payload.errors?.length) {\n throw new Error(payload.errors[0]?.message ?? 'GraphQL request failed.');\n }\n\n return payload.data?.users?.data ?? [];\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const hotRef = useRef>(null);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n const [showRefresh, setShowRefresh] = useState(false);\n\n // Step 5: Initial load uses loadData() via the hot instance, which resets all grid states.\n const initialLoad = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.loadData(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n setShowRefresh(true);\n } catch (_error) {\n hotRef.current?.hotInstance?.loadData([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // Step 6: Subsequent refreshes use updateData(), which replaces the data\n // without resetting column sort order, selection, or column order.\n const refreshUsers = async () => {\n setStatus(STATUS_REFRESHING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.updateData(mapUsersToGridRows(users));\n setStatus(STATUS_REFRESHED);\n setShowRefresh(true);\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { initialLoad(); }, []);\n\n return (\n
    \n
    \n
    \n {showRefresh && !hasError && (\n \n Refresh\n \n )}\n {hasError && (\n \n Retry\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-graphql/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from a GraphQL API"],"guide":"recipes/data-management/load-data-graphql/load-data-graphql.md","guideTitle":"Load data from a GraphQL API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-graphql","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example1.ts.json index 7cc612667..05b9cf110 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { DataProviderQueryParameters, DataProviderFetchOptions } from 'handsontable/plugins/dataProvider';\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nasync function fetchRows(\n { page, pageSize, sort, filters }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions,\n) {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-load-data-odata',\n template: ``,\n})\nexport class AppComponent {\n readonly gridSettings: GridSettings = {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows,\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-odata/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type { DataProviderQueryParameters, DataProviderFetchOptions } from 'handsontable/plugins/dataProvider';\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nasync function fetchRows(\n { page, pageSize, sort, filters }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions,\n) {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-load-data-odata',\n template: ``,\n})\nexport class AppComponent {\n readonly gridSettings: GridSettings = {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows,\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-odata/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example2.ts.json index 6d14a8aad..f624a3b86 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-load-data-odata',\n template: ``,\n})\nexport class AppComponent {\n readonly data = [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query: string, process: (names: string[]) => void) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-odata/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example2-load-data-odata',\n template: ``,\n})\nexport class AppComponent {\n readonly data = [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query: string, process: (names: string[]) => void) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-odata/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.js.json index f1cd0824c..bf5a6d8f9 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters) {\n return (filters ?? [])\n .map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value) =>\n isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`;\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped =\n Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n })\n .filter(Boolean)\n .join(' and ');\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows: async ({ page, pageSize, sort, filters }, { signal }) => {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n },\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters) {\n return (filters ?? [])\n .map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value) =>\n isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`;\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped =\n Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n })\n .filter(Boolean)\n .join(' and ');\n}\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows: async ({ page, pageSize, sort, filters }, { signal }) => {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n },\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.ts.json index e247659f4..e928db2bd 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows: async ({ page, pageSize, sort, filters }, { signal }) => {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n },\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n dataProvider: {\n rowId: 'ProductID',\n fetchRows: async ({ page, pageSize, sort, filters }, { signal }) => {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n },\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['Product', 'Quantity per unit', 'Unit price', 'Units in stock'],\n columns: [\n { data: 'ProductName', width: 240 },\n { data: 'QuantityPerUnit', width: 180 },\n { data: 'UnitPrice', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD' } },\n { data: 'UnitsInStock', type: 'numeric' },\n ],\n readOnly: true,\n pagination: { pageSize: 10 },\n columnSorting: true,\n filters: true,\n dropdownMenu: true,\n emptyDataState: true,\n notification: true,\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.js.json index f5fe27130..7646901f8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query) {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product) => product.ProductName);\n}\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ],\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query, process) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query) {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product) => product.ProductName);\n}\n\nconst container = document.querySelector('#example2');\n\nnew Handsontable(container, {\n data: [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ],\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query, process) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.ts.json index 1f0c39b32..6108a24e2 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ],\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query, process) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\nconst container = document.querySelector('#example2')!;\n\nnew Handsontable(container, {\n data: [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n ],\n colHeaders: ['Order', 'Product', 'Quantity'],\n columns: [\n { data: 'order', readOnly: true },\n {\n data: 'product',\n type: 'autocomplete',\n width: 240,\n strict: false,\n // Show no suggestions when the request fails.\n source(query, process) {\n fetchProductNames(query).then(process, () => process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ],\n height: 'auto',\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-odata/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example1.tsx.json index 1c83d3e9a..1b27bbc37 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters, DataProviderFetchOptions } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nasync function fetchRows(\n { page, pageSize, sort, filters }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions,\n) {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n}\n\nconst dataProvider = {\n rowId: 'ProductID',\n fetchRows,\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n};\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-odata/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { DataProviderQueryParameters, DataProviderFetchOptions } from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\nconst NUMERIC_FIELDS = ['UnitPrice', 'UnitsInStock'];\n\n// Each Handsontable filter condition becomes one OData `$filter` expression.\nconst CONDITIONS: Record string> = {\n eq: (f, a) => `${f} eq ${a}`,\n neq: (f, a) => `${f} ne ${a}`,\n gt: (f, a) => `${f} gt ${a}`,\n gte: (f, a) => `${f} ge ${a}`,\n lt: (f, a) => `${f} lt ${a}`,\n lte: (f, a) => `${f} le ${a}`,\n between: (f, a, b) => `${f} ge ${a} and ${f} le ${b}`,\n not_between: (f, a, b) => `${f} lt ${a} or ${f} gt ${b}`,\n contains: (f, a) => `contains(${f},${a})`,\n not_contains: (f, a) => `not contains(${f},${a})`,\n begins_with: (f, a) => `startswith(${f},${a})`,\n ends_with: (f, a) => `endswith(${f},${a})`,\n empty: (f) => `${f} eq null`,\n not_empty: (f) => `${f} ne null`,\n};\n\nfunction toODataFilter(filters: DataProviderQueryParameters['filters']): string {\n return (filters ?? []).map(({ prop, operation, conditions }) => {\n const isNumeric = NUMERIC_FIELDS.includes(prop);\n // Compare text in lower case, because the Filters plugin ignores case.\n const field = isNumeric ? prop : `tolower(${prop})`;\n const toLiteral = (value: unknown) => (isNumeric ? parseFloat(String(value)) : `'${String(value).toLowerCase().replace(/'/g, \"''\")}'`);\n const parts = conditions.flatMap(({ name = '', args }) => {\n // Like the Filters plugin, accept the two bounds of `between` in either order.\n const values = isNumeric ? args.map(toLiteral).sort((x, y) => Number(x) - Number(y)) : args.map(toLiteral);\n // Skip a condition the table does not map, or a numeric input that is not a number.\n const isMapped = Object.hasOwn(CONDITIONS, name) && values.every((v) => typeof v === 'string' || Number.isFinite(v));\n\n return isMapped ? [`(${CONDITIONS[name](field, ...values)})`] : [];\n });\n\n return parts.length ? `(${parts.join(operation === 'conjunction' ? ' and ' : ' or ')})` : '';\n }).filter(Boolean).join(' and ');\n}\n\nasync function fetchRows(\n { page, pageSize, sort, filters }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions,\n) {\n const filter = toODataFilter(filters);\n const query = new URLSearchParams({\n $count: 'true',\n $top: `${pageSize}`,\n $skip: `${(page - 1) * pageSize}`,\n ...(sort ? { $orderby: `${sort.prop} ${sort.order}` } : {}),\n ...(filter ? { $filter: filter } : {}),\n });\n const response = await fetch(`${SERVICE_URL}?${query}`, { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return { rows: json.value, totalRows: json['@odata.count'] };\n}\n\nconst dataProvider = {\n rowId: 'ProductID',\n fetchRows,\n // The Northwind demo service is read-only, so the write callbacks do nothing.\n onRowsCreate: async () => [],\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n};\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-odata/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example2.tsx.json index 2380f2091..775aaf901 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\n// Keep the data outside the component, so a re-render does not reload it.\nconst data = [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n];\n\nconst ExampleComponent = () => {\n return (\n process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ]}\n height=\"auto\"\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-odata/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SERVICE_URL = 'https://services.odata.org/V4/Northwind/Northwind.svc/Products';\n\n// Ask the OData service for up to 10 product names that contain the typed text.\nasync function fetchProductNames(query: string): Promise {\n const term = query.toLowerCase().replace(/'/g, \"''\");\n const params = new URLSearchParams({\n $select: 'ProductName',\n $top: '10',\n $orderby: 'ProductName',\n $filter: `contains(tolower(ProductName),'${term}')`,\n });\n const response = await fetch(`${SERVICE_URL}?${params}`);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const json = await response.json();\n\n return json.value.map((product: { ProductName: string }) => product.ProductName);\n}\n\n// Keep the data outside the component, so a re-render does not reload it.\nconst data = [\n { order: 'SO-10248', product: 'Queso Cabrales', quantity: 12 },\n { order: 'SO-10249', product: 'Tofu', quantity: 9 },\n { order: 'SO-10250', product: 'Manjimup Dried Apples', quantity: 35 },\n { order: 'SO-10251', product: 'Ravioli Angelo', quantity: 6 },\n { order: 'SO-10252', product: 'Chang', quantity: 25 },\n];\n\nconst ExampleComponent = () => {\n return (\n process([]));\n },\n },\n { data: 'quantity', type: 'numeric' },\n ]}\n height=\"auto\"\n licenseKey=\"non-commercial-and-evaluation\"\n />\n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-odata/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example1.vue.json index 6e19ed28d..e0dfa9c8c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"recipes/data-management/load-data-odata/vue/example1.vue","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"Vue 3"} +{"framework":"vue","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n"},"docsPath":"recipes/data-management/load-data-odata/vue/example1.vue","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-odata","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example2.vue.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example2.vue.json index 6bc7c8110..e0609159b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example2.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-odata__vue__example2.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"recipes/data-management/load-data-odata/vue/example2.vue","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"Vue 3"} +{"framework":"vue","displayName":"Recipes ▸ Data Management ▸ Load data from an OData service · Step 3: Fill an autocomplete cell from the service · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example2\");","/src/App.vue":"\n\n"},"docsPath":"recipes/data-management/load-data-odata/vue/example2.vue","breadcrumb":["Recipes","Data Management","Load data from an OData service"],"guide":"recipes/data-management/load-data-odata/load-data-odata.md","guideTitle":"Load data from an OData service","exampleId":"example2","exampleTitle":"Step 3: Fill an autocomplete cell from the service","docPermalink":"/recipes/data-management/load-data-odata","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example1.ts.json index 1d0e9df51..d65d57eac 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nfunction mapUsersToGridRows(users: Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n}>): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n@Component({\n selector: 'example1-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n @if (hasError) {\n \n }\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusMessage = STATUS_LOADING;\n hasError = false;\n loading = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n private setStatus(message: string, hasError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.hasError = hasError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n async loadUsers(): Promise {\n this.loading = true;\n this.setStatus(STATUS_LOADING);\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n this.hotTable.hotInstance?.loadData(mapUsersToGridRows(users));\n this.setStatus(STATUS_READY);\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n void this.loadUsers();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nfunction mapUsersToGridRows(users: Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n}>): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n@Component({\n selector: 'example1-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n @if (hasError) {\n \n }\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusMessage = STATUS_LOADING;\n hasError = false;\n loading = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n private setStatus(message: string, hasError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.hasError = hasError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n async loadUsers(): Promise {\n this.loading = true;\n this.setStatus(STATUS_LOADING);\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n this.hotTable.hotInstance?.loadData(mapUsersToGridRows(users));\n this.setStatus(STATUS_READY);\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n void this.loadUsers();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example2.ts.json index dddcca711..2a1a741ee 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example2.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n@Component({\n selector: 'example2-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n @if (hasData && !hasError) {\n \n } @else if (hasError) {\n \n }\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusMessage = STATUS_LOADING;\n hasError = false;\n hasData = false;\n loading = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n private setStatus(message: string, hasError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.hasError = hasError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n }\n\n async initialLoad(): Promise {\n this.loading = true;\n this.setStatus(STATUS_LOADING);\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.loadData(mapUsersToGridRows(users));\n this.hasData = true;\n this.setStatus(STATUS_READY);\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n async refreshUsers(): Promise {\n this.loading = true;\n this.setStatus(STATUS_REFRESHING);\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.updateData(mapUsersToGridRows(users));\n this.setStatus(STATUS_REFRESHED);\n } catch (_error) {\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n void this.initialLoad();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, AfterViewInit, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n@Component({\n selector: 'example2-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n
    \n @if (hasData && !hasError) {\n \n } @else if (hasError) {\n \n }\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent implements AfterViewInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusMessage = STATUS_LOADING;\n hasError = false;\n hasData = false;\n loading = false;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n };\n\n private setStatus(message: string, hasError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.hasError = hasError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n private async fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n }\n\n async initialLoad(): Promise {\n this.loading = true;\n this.setStatus(STATUS_LOADING);\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.loadData(mapUsersToGridRows(users));\n this.hasData = true;\n this.setStatus(STATUS_READY);\n } catch (_error) {\n this.hotTable.hotInstance?.loadData([]);\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n async refreshUsers(): Promise {\n this.loading = true;\n this.setStatus(STATUS_REFRESHING);\n\n try {\n const users = await this.fetchUsers();\n\n this.hotTable.hotInstance?.updateData(mapUsersToGridRows(users));\n this.setStatus(STATUS_REFRESHED);\n } catch (_error) {\n this.setStatus(STATUS_ERROR, true);\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n ngAfterViewInit(): void {\n void this.initialLoad();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example3.ts.json index 69d23830e..5b1b9e06e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__angular__example3.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\n@Component({\n selector: 'example3-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusIsError = false;\n statusMessage = 'Loading...';\n\n private cachedRows: UserRow[] | null = null;\n\n readonly hotSettings: GridSettings;\n\n /** Defers binding updates so sync data-provider hooks do not trigger NG0100 in dev mode. */\n private setFetchStatus(message: string, isError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.statusIsError = isError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n constructor() {\n this.hotSettings = {\n dataProvider: {\n rowId: 'id',\n fetchRows: async (\n { page, pageSize, sort }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions\n ) => {\n let rows = await this.loadAllRows(signal);\n\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n if (!params.skipLoading) {\n this.setFetchStatus('Loading...', false);\n }\n },\n afterDataProviderFetch: () => {\n this.setFetchStatus('Loaded from REST API via dataProvider.', false);\n },\n afterDataProviderFetchError: (error: Error) => {\n this.setFetchStatus(`Error: ${error.message}`, true);\n },\n };\n }\n\n private async loadAllRows(signal: AbortSignal): Promise {\n if (this.cachedRows !== null) {\n return this.cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n this.cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return this.cachedRows;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example3.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\n@Component({\n selector: 'example3-load-data-rest-api',\n standalone: true,\n imports: [HotTableModule],\n template: `\n
    \n {{ statusMessage }}\n
    \n \n `,\n})\nexport class AppComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n statusIsError = false;\n statusMessage = 'Loading...';\n\n private cachedRows: UserRow[] | null = null;\n\n readonly hotSettings: GridSettings;\n\n /** Defers binding updates so sync data-provider hooks do not trigger NG0100 in dev mode. */\n private setFetchStatus(message: string, isError = false): void {\n setTimeout(() => {\n this.statusMessage = message;\n this.statusIsError = isError;\n this.cdr.markForCheck();\n }, 0);\n }\n\n constructor() {\n this.hotSettings = {\n dataProvider: {\n rowId: 'id',\n fetchRows: async (\n { page, pageSize, sort }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions\n ) => {\n let rows = await this.loadAllRows(signal);\n\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n beforeDataProviderFetch: (params: DataProviderBeforeFetchParameters) => {\n if (!params.skipLoading) {\n this.setFetchStatus('Loading...', false);\n }\n },\n afterDataProviderFetch: () => {\n this.setFetchStatus('Loaded from REST API via dataProvider.', false);\n },\n afterDataProviderFetchError: (error: Error) => {\n this.setFetchStatus(`Error: ${error.message}`, true);\n },\n };\n }\n\n private async loadAllRows(signal: AbortSignal): Promise {\n if (this.cachedRows !== null) {\n return this.cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n this.cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return this.cachedRows;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/load-data-rest-api/angular/example3.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.js.json index 717a44b64..21eed2fd3 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = await response.json();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example1');\n\nif (!container) {\n throw new Error('Missing #example1 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = await response.json();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example1.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.ts.json index 5b306f8f3..effc03299 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst rootContainer = document.querySelector('#example1') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(controlsContainer);\nrootContainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = (await response.json()) as ApiUser[];\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst rootContainer = document.querySelector('#example1') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example1-status';\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(controlsContainer);\nrootContainer.appendChild(gridContainer);\n\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n retryButton.hidden = !hasError;\n retryButton.disabled = loading;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nasync function loadUsers() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n const users = (await response.json()) as ApiUser[];\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nretryButton.addEventListener('click', () => {\n loadUsers();\n});\n\nloadUsers();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.js.json index 538605aa0..e89719126 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers() {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json();\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst container = document.querySelector('#example2');\n\nif (!container) {\n throw new Error('Missing #example2 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(controlsContainer);\ncontainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({ loading = false, hasError = false, message = '' } = {}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers() {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json();\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example2.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.ts.json index dd5f578cf..adb9d93bf 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example2.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst rootContainer = document.querySelector('#example2') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(controlsContainer);\nrootContainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nconst rootContainer = document.querySelector('#example2') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst controls = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst refreshButton = document.createElement('button');\nconst retryButton = document.createElement('button');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\ncontrols.className = 'controls';\nstatusOutput.id = 'example2-status';\n\nrefreshButton.type = 'button';\nrefreshButton.textContent = 'Refresh';\nrefreshButton.hidden = true;\n\nretryButton.type = 'button';\nretryButton.textContent = 'Retry';\nretryButton.hidden = true;\n\ncontrols.appendChild(refreshButton);\ncontrols.appendChild(retryButton);\ncontrolsContainer.appendChild(controls);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(controlsContainer);\nrootContainer.appendChild(gridContainer);\n\n// Step 1: Initialize the grid with columnSorting enabled and an empty dataset.\nconst hot = new Handsontable(gridContainer, {\n data: [],\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70 },\n { data: 'name', type: 'text', width: 190 },\n { data: 'username', type: 'text', width: 150 },\n { data: 'email', type: 'text', width: 220 },\n { data: 'city', type: 'text', width: 140 },\n { data: 'company', type: 'text', width: 180 },\n ],\n // Enables clickable sort indicators on column headers.\n columnSorting: true,\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Step 2: A helper that keeps the toolbar consistent with the current request state.\nfunction setUiState({\n loading = false,\n hasError = false,\n message = '',\n}: {\n loading?: boolean;\n hasError?: boolean;\n message?: string;\n}) {\n statusOutput.textContent = message;\n statusOutput.classList.toggle('is-error', hasError);\n // Show \"Retry\" only when there is an error.\n retryButton.hidden = !hasError;\n // Show \"Refresh\" only when the grid has data and no error is active.\n refreshButton.hidden = hasError || loading;\n refreshButton.disabled = loading;\n retryButton.disabled = loading;\n}\n\n// Step 3: Map the API response to flat row objects that match the column definitions.\nfunction mapUsersToGridRows(users: ApiUser[]) {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\n// Step 4: Shared fetch helper used by both initialLoad() and refreshUsers().\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\n// Step 5: Initial load uses loadData(), which resets all grid states.\n// This is correct for a first load -- there is no existing state to preserve.\nasync function initialLoad() {\n setUiState({ loading: true, message: STATUS_LOADING });\n\n try {\n const users = await fetchUsers();\n\n hot.loadData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_READY });\n } catch (_error) {\n hot.loadData([]);\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\n// Step 6: Subsequent refreshes use updateData(), which replaces the data\n// without resetting column sort order, selection, or column order.\nasync function refreshUsers() {\n setUiState({ loading: true, message: STATUS_REFRESHING });\n\n try {\n const users = await fetchUsers();\n\n hot.updateData(mapUsersToGridRows(users));\n setUiState({ message: STATUS_REFRESHED });\n } catch (_error) {\n // On error, do not clear the grid -- the existing data is still valid.\n setUiState({ hasError: true, message: STATUS_ERROR });\n }\n}\n\nrefreshButton.addEventListener('click', () => {\n refreshUsers();\n});\n\nretryButton.addEventListener('click', () => {\n initialLoad();\n});\n\ninitialLoad();","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example2.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.js.json index 25d319432..239577e4a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Step 1: Cache the full response after the first request.\n// Every subsequent fetchRows call (page change, column sort) reuses this\n// without hitting the network again.\nlet cachedRows = null;\n\nasync function loadAllRows(signal) {\n if (cachedRows !== null) {\n return cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = await response.json();\n\n cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRows;\n}\n\nconst container = document.querySelector('#example3');\n\nif (!container) {\n throw new Error('Missing #example3 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\nstatusOutput.id = 'example3-status';\nstatusOutput.textContent = 'Loading...';\n\ncontainer.appendChild(controlsContainer);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(gridContainer);\n\nnew Handsontable(gridContainer, {\n // Step 2: Use dataProvider instead of a static data array.\n // Handsontable calls fetchRows automatically on init, page change, and sort change.\n dataProvider: {\n // rowId tells the plugin which field holds the stable row identity.\n // It is required for CRUD callbacks and internal refetch tracking.\n rowId: 'id',\n\n // Step 3: fetchRows receives current query parameters and an AbortSignal.\n // Return { rows, totalRows } so the Pagination plugin knows the total row count.\n async fetchRows({ page, pageSize, sort }, { signal }) {\n let rows = await loadAllRows(signal);\n\n // Step 4: Apply server-side sort from query parameters.\n // In production, pass sort.prop and sort.order to your API instead.\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop];\n const bv = b[sort.prop];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n // Step 5: Apply server-side pagination from query parameters.\n // In production, pass page and pageSize to your API instead.\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n\n // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops.\n // Replace with POST / PATCH / DELETE calls to a real API.\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n\n // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows\n // how many rows to request. columnSorting enables server-driven sort.\n // emptyDataState shows a loading overlay while fetchRows is in flight.\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Step 8: Use fetch hooks to update the status label.\n // skipLoading is true for internal refetches (after sort) -- skip the \"Loading...\" message\n // in those cases so the grid does not flash a spinner on every column header click.\n beforeDataProviderFetch: ({ skipLoading }) => {\n if (!skipLoading) {\n statusOutput.textContent = 'Loading...';\n statusOutput.classList.remove('is-error');\n }\n },\n afterDataProviderFetch: () => {\n statusOutput.textContent = 'Loaded from REST API via dataProvider.';\n statusOutput.classList.remove('is-error');\n },\n afterDataProviderFetchError: (error) => {\n statusOutput.textContent = `Error: ${error.message}`;\n statusOutput.classList.add('is-error');\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example3.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n// Step 1: Cache the full response after the first request.\n// Every subsequent fetchRows call (page change, column sort) reuses this\n// without hitting the network again.\nlet cachedRows = null;\n\nasync function loadAllRows(signal) {\n if (cachedRows !== null) {\n return cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = await response.json();\n\n cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRows;\n}\n\nconst container = document.querySelector('#example3');\n\nif (!container) {\n throw new Error('Missing #example3 element.');\n}\n\nconst controlsContainer = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\nstatusOutput.id = 'example3-status';\nstatusOutput.textContent = 'Loading...';\n\ncontainer.appendChild(controlsContainer);\ncontrolsContainer.appendChild(statusOutput);\ncontainer.appendChild(gridContainer);\n\nnew Handsontable(gridContainer, {\n // Step 2: Use dataProvider instead of a static data array.\n // Handsontable calls fetchRows automatically on init, page change, and sort change.\n dataProvider: {\n // rowId tells the plugin which field holds the stable row identity.\n // It is required for CRUD callbacks and internal refetch tracking.\n rowId: 'id',\n\n // Step 3: fetchRows receives current query parameters and an AbortSignal.\n // Return { rows, totalRows } so the Pagination plugin knows the total row count.\n async fetchRows({ page, pageSize, sort }, { signal }) {\n let rows = await loadAllRows(signal);\n\n // Step 4: Apply server-side sort from query parameters.\n // In production, pass sort.prop and sort.order to your API instead.\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop];\n const bv = b[sort.prop];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n // Step 5: Apply server-side pagination from query parameters.\n // In production, pass page and pageSize to your API instead.\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n\n // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops.\n // Replace with POST / PATCH / DELETE calls to a real API.\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n\n // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows\n // how many rows to request. columnSorting enables server-driven sort.\n // emptyDataState shows a loading overlay while fetchRows is in flight.\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Step 8: Use fetch hooks to update the status label.\n // skipLoading is true for internal refetches (after sort) -- skip the \"Loading...\" message\n // in those cases so the grid does not flash a spinner on every column header click.\n beforeDataProviderFetch: ({ skipLoading }) => {\n if (!skipLoading) {\n statusOutput.textContent = 'Loading...';\n statusOutput.classList.remove('is-error');\n }\n },\n afterDataProviderFetch: () => {\n statusOutput.textContent = 'Loaded from REST API via dataProvider.';\n statusOutput.classList.remove('is-error');\n },\n afterDataProviderFetchError: (error) => {\n statusOutput.textContent = `Error: ${error.message}`;\n statusOutput.classList.add('is-error');\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example3.js","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.ts.json index cf6e53af1..68e2c5d42 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__javascript__example3.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\n// Step 1: Cache the full response after the first request.\n// Every subsequent fetchRows call (page change, column sort) reuses this\n// without hitting the network again.\nlet cachedRows: UserRow[] | null = null;\n\nasync function loadAllRows(signal: AbortSignal): Promise {\n if (cachedRows !== null) {\n return cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRows;\n}\n\nconst rootContainer = document.querySelector('#example3') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\nstatusOutput.id = 'example3-status';\nstatusOutput.textContent = 'Loading...';\n\nrootContainer.appendChild(controlsContainer);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(gridContainer);\n\nnew Handsontable(gridContainer, {\n // Step 2: Use dataProvider instead of a static data array.\n // Handsontable calls fetchRows automatically on init, page change, and sort change.\n dataProvider: {\n // rowId tells the plugin which field holds the stable row identity.\n // It is required for CRUD callbacks and internal refetch tracking.\n rowId: 'id',\n\n // Step 3: fetchRows receives current query parameters and an AbortSignal.\n // Return { rows, totalRows } so the Pagination plugin knows the total row count.\n async fetchRows(\n { page, pageSize, sort }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions\n ) {\n let rows = await loadAllRows(signal);\n\n // Step 4: Apply server-side sort from query parameters.\n // In production, pass sort.prop and sort.order to your API instead.\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n // Step 5: Apply server-side pagination from query parameters.\n // In production, pass page and pageSize to your API instead.\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n\n // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops.\n // Replace with POST / PATCH / DELETE calls to a real API.\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n\n // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows\n // how many rows to request. columnSorting enables server-driven sort.\n // emptyDataState shows a loading overlay while fetchRows is in flight.\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Step 8: Use fetch hooks to update the status label.\n // skipLoading is true for internal refetches (after sort) -- skip the \"Loading...\" message\n // in those cases so the grid does not flash a spinner on every column header click.\n beforeDataProviderFetch: ({ skipLoading }: DataProviderBeforeFetchParameters) => {\n if (!skipLoading) {\n statusOutput.textContent = 'Loading...';\n statusOutput.classList.remove('is-error');\n }\n },\n afterDataProviderFetch: () => {\n statusOutput.textContent = 'Loaded from REST API via dataProvider.';\n statusOutput.classList.remove('is-error');\n },\n afterDataProviderFetchError: (error: Error) => {\n statusOutput.textContent = `Error: ${error.message}`;\n statusOutput.classList.add('is-error');\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example3.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type {\n DataProviderQueryParameters,\n DataProviderFetchOptions,\n DataProviderBeforeFetchParameters,\n} from 'handsontable/plugins/dataProvider';\n\nregisterAllModules();\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\n// Step 1: Cache the full response after the first request.\n// Every subsequent fetchRows call (page change, column sort) reuses this\n// without hitting the network again.\nlet cachedRows: UserRow[] | null = null;\n\nasync function loadAllRows(signal: AbortSignal): Promise {\n if (cachedRows !== null) {\n return cachedRows;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as Array<{\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n }>;\n\n cachedRows = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRows;\n}\n\nconst rootContainer = document.querySelector('#example3') as HTMLDivElement;\n\nconst controlsContainer = document.createElement('div');\nconst statusOutput = document.createElement('output');\nconst gridContainer = document.createElement('div');\n\ncontrolsContainer.className = 'example-controls-container';\nstatusOutput.id = 'example3-status';\nstatusOutput.textContent = 'Loading...';\n\nrootContainer.appendChild(controlsContainer);\ncontrolsContainer.appendChild(statusOutput);\nrootContainer.appendChild(gridContainer);\n\nnew Handsontable(gridContainer, {\n // Step 2: Use dataProvider instead of a static data array.\n // Handsontable calls fetchRows automatically on init, page change, and sort change.\n dataProvider: {\n // rowId tells the plugin which field holds the stable row identity.\n // It is required for CRUD callbacks and internal refetch tracking.\n rowId: 'id',\n\n // Step 3: fetchRows receives current query parameters and an AbortSignal.\n // Return { rows, totalRows } so the Pagination plugin knows the total row count.\n async fetchRows(\n { page, pageSize, sort }: DataProviderQueryParameters,\n { signal }: DataProviderFetchOptions\n ) {\n let rows = await loadAllRows(signal);\n\n // Step 4: Apply server-side sort from query parameters.\n // In production, pass sort.prop and sort.order to your API instead.\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n // Step 5: Apply server-side pagination from query parameters.\n // In production, pass page and pageSize to your API instead.\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n\n // Step 6: CRUD callbacks. jsonplaceholder is read-only, so these are no-ops.\n // Replace with POST / PATCH / DELETE calls to a real API.\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n },\n\n colHeaders: ['ID', 'Name', 'Username', 'Email', 'City', 'Company'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'name', type: 'text', width: 190, readOnly: true },\n { data: 'username', type: 'text', width: 150, readOnly: true },\n { data: 'email', type: 'text', width: 220, readOnly: true },\n { data: 'city', type: 'text', width: 140, readOnly: true },\n { data: 'company', type: 'text', width: 180, readOnly: true },\n ],\n\n // Step 7: Enable the Pagination plugin and pass pageSize so the plugin knows\n // how many rows to request. columnSorting enables server-driven sort.\n // emptyDataState shows a loading overlay while fetchRows is in flight.\n pagination: { pageSize: 5 },\n columnSorting: true,\n emptyDataState: true,\n\n rowHeaders: true,\n height: 360,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Step 8: Use fetch hooks to update the status label.\n // skipLoading is true for internal refetches (after sort) -- skip the \"Loading...\" message\n // in those cases so the grid does not flash a spinner on every column header click.\n beforeDataProviderFetch: ({ skipLoading }: DataProviderBeforeFetchParameters) => {\n if (!skipLoading) {\n statusOutput.textContent = 'Loading...';\n statusOutput.classList.remove('is-error');\n }\n },\n afterDataProviderFetch: () => {\n statusOutput.textContent = 'Loaded from REST API via dataProvider.';\n statusOutput.classList.remove('is-error');\n },\n afterDataProviderFetchError: (error: Error) => {\n statusOutput.textContent = `Error: ${error.message}`;\n statusOutput.classList.add('is-error');\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/load-data-rest-api/javascript/example3.ts","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example1.tsx.json index 96d1cf532..41223f11b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const [rows, setRows] = useState([]);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n\n const loadUsers = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n\n try {\n const users = await fetchUsers();\n\n setRows(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n } catch (_error) {\n setRows([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { loadUsers(); }, []);\n\n return (\n
    \n
    \n
    \n {hasError && (\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY = 'Loaded users from REST API.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const [rows, setRows] = useState([]);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n\n const loadUsers = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n\n try {\n const users = await fetchUsers();\n\n setRows(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n } catch (_error) {\n setRows([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { loadUsers(); }, []);\n\n return (\n
    \n
    \n
    \n {hasError && (\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example1.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example2.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example2.tsx.json index 531f3a372..4ad24937f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example2.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example2.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const hotRef = useRef>(null);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n const [showRefresh, setShowRefresh] = useState(false);\n\n const initialLoad = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.loadData(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n setShowRefresh(true);\n } catch (_error) {\n hotRef.current?.hotInstance?.loadData([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n const refreshUsers = async () => {\n setStatus(STATUS_REFRESHING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.updateData(mapUsersToGridRows(users));\n setStatus(STATUS_REFRESHED);\n setShowRefresh(true);\n } catch (_error) {\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { initialLoad(); }, []);\n\n return (\n
    \n
    \n
    \n {showRefresh && !hasError && (\n \n Refresh\n \n )}\n {hasError && (\n \n Retry\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using updateData() to preserve sorting and other states · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example2\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState, useEffect, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\nconst STATUS_LOADING = 'Loading users...';\nconst STATUS_READY =\n 'Users loaded. Sort a column, then click \"Refresh\" to see that the column sort order is preserved.';\nconst STATUS_REFRESHING = 'Refreshing...';\nconst STATUS_REFRESHED = 'Data refreshed -- column sort order was preserved.';\nconst STATUS_ERROR = 'Failed to load users. Try again.';\n\nasync function fetchUsers(): Promise {\n const response = await fetch('https://jsonplaceholder.typicode.com/users');\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status}`);\n }\n\n return response.json() as Promise;\n}\n\nfunction mapUsersToGridRows(users: ApiUser[]): UserRow[] {\n return users.map((user) => ({\n id: user.id,\n name: user.name,\n username: user.username,\n email: user.email,\n city: user.address?.city ?? '',\n company: user.company?.name ?? '',\n }));\n}\n\nconst ExampleComponent = () => {\n const hotRef = useRef>(null);\n const [status, setStatus] = useState(STATUS_LOADING);\n const [hasError, setHasError] = useState(false);\n const [showRefresh, setShowRefresh] = useState(false);\n\n const initialLoad = async () => {\n setStatus(STATUS_LOADING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.loadData(mapUsersToGridRows(users));\n setStatus(STATUS_READY);\n setShowRefresh(true);\n } catch (_error) {\n hotRef.current?.hotInstance?.loadData([]);\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n const refreshUsers = async () => {\n setStatus(STATUS_REFRESHING);\n setHasError(false);\n setShowRefresh(false);\n\n try {\n const users = await fetchUsers();\n\n hotRef.current?.hotInstance?.updateData(mapUsersToGridRows(users));\n setStatus(STATUS_REFRESHED);\n setShowRefresh(true);\n } catch (_error) {\n setHasError(true);\n setStatus(STATUS_ERROR);\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => { initialLoad(); }, []);\n\n return (\n
    \n
    \n
    \n {showRefresh && !hasError && (\n \n Refresh\n \n )}\n {hasError && (\n \n Retry\n \n )}\n
    \n {status}\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example2.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example2","exampleTitle":"Using updateData() to preserve sorting and other states","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example3.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example3.tsx.json index d9556b14e..5b9b4489d 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example3.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__load-data-rest-api__react__example3.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useMemo, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst pagination = { pageSize: 5 };\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\ntype SortDescriptor = { prop: string; order: 'asc' | 'desc' } | null;\n\nconst ExampleComponent = () => {\n const cachedRowsRef = useRef(null);\n const statusRef = useRef(null);\n\n const loadAllRows = useCallback(async (signal: AbortSignal): Promise => {\n if (cachedRowsRef.current !== null) {\n return cachedRowsRef.current;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as ApiUser[];\n\n cachedRowsRef.current = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRowsRef.current;\n }, []);\n\n const fetchRows = useCallback(\n async (\n { page, pageSize, sort }: { page: number; pageSize: number; sort: SortDescriptor },\n { signal }: { signal: AbortSignal }\n ) => {\n let rows = await loadAllRows(signal);\n\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n [loadAllRows]\n );\n\n const dataProvider = useMemo(\n () => ({\n rowId: 'id',\n fetchRows,\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n }),\n [fetchRows]\n );\n\n const beforeDataProviderFetch = useCallback((params: { skipLoading?: boolean }) => {\n if (params.skipLoading || !statusRef.current) return;\n statusRef.current.textContent = 'Loading...';\n statusRef.current.classList.remove('is-error');\n }, []);\n\n const afterDataProviderFetch = useCallback(() => {\n if (!statusRef.current) return;\n statusRef.current.textContent = 'Loaded from REST API via dataProvider.';\n statusRef.current.classList.remove('is-error');\n }, []);\n\n const afterDataProviderFetchError = useCallback((error: Error) => {\n if (!statusRef.current) return;\n statusRef.current.textContent = `Error: ${error.message}`;\n statusRef.current.classList.add('is-error');\n }, []);\n\n return (\n
    \n
    \n \n Loading...\n \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example3.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Load data from a REST API · Using dataProvider for automatic pagination and sorting · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example3\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useMemo, useRef } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst pagination = { pageSize: 5 };\n\ntype ApiUser = {\n id: number;\n name: string;\n username: string;\n email: string;\n address?: { city?: string };\n company?: { name?: string };\n};\n\ntype UserRow = {\n id: number;\n name: string;\n username: string;\n email: string;\n city: string;\n company: string;\n};\n\ntype SortDescriptor = { prop: string; order: 'asc' | 'desc' } | null;\n\nconst ExampleComponent = () => {\n const cachedRowsRef = useRef(null);\n const statusRef = useRef(null);\n\n const loadAllRows = useCallback(async (signal: AbortSignal): Promise => {\n if (cachedRowsRef.current !== null) {\n return cachedRowsRef.current;\n }\n\n const response = await fetch('https://jsonplaceholder.typicode.com/users', { signal });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const users = (await response.json()) as ApiUser[];\n\n cachedRowsRef.current = users.map((u) => ({\n id: u.id,\n name: u.name,\n username: u.username,\n email: u.email,\n city: u.address?.city ?? '',\n company: u.company?.name ?? '',\n }));\n\n return cachedRowsRef.current;\n }, []);\n\n const fetchRows = useCallback(\n async (\n { page, pageSize, sort }: { page: number; pageSize: number; sort: SortDescriptor },\n { signal }: { signal: AbortSignal }\n ) => {\n let rows = await loadAllRows(signal);\n\n if (sort) {\n rows = [...rows].sort((a, b) => {\n const av = a[sort.prop as keyof UserRow];\n const bv = b[sort.prop as keyof UserRow];\n const cmp = av < bv ? -1 : av > bv ? 1 : 0;\n\n return sort.order === 'asc' ? cmp : -cmp;\n });\n }\n\n const start = (page - 1) * pageSize;\n\n return {\n rows: rows.slice(start, start + pageSize),\n totalRows: rows.length,\n };\n },\n [loadAllRows]\n );\n\n const dataProvider = useMemo(\n () => ({\n rowId: 'id',\n fetchRows,\n onRowsCreate: async () => {},\n onRowsUpdate: async () => {},\n onRowsRemove: async () => {},\n }),\n [fetchRows]\n );\n\n const beforeDataProviderFetch = useCallback((params: { skipLoading?: boolean }) => {\n if (params.skipLoading || !statusRef.current) return;\n statusRef.current.textContent = 'Loading...';\n statusRef.current.classList.remove('is-error');\n }, []);\n\n const afterDataProviderFetch = useCallback(() => {\n if (!statusRef.current) return;\n statusRef.current.textContent = 'Loaded from REST API via dataProvider.';\n statusRef.current.classList.remove('is-error');\n }, []);\n\n const afterDataProviderFetchError = useCallback((error: Error) => {\n if (!statusRef.current) return;\n statusRef.current.textContent = `Error: ${error.message}`;\n statusRef.current.classList.add('is-error');\n }, []);\n\n return (\n
    \n
    \n \n Loading...\n \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/load-data-rest-api/react/example3.tsx","breadcrumb":["Recipes","Data Management","Load data from a REST API"],"guide":"recipes/data-management/load-data-rest-api/load-data-rest-api.md","guideTitle":"Load data from a REST API","exampleId":"example3","exampleTitle":"Using dataProvider for automatic pagination and sorting","docPermalink":"/recipes/data-management/load-data-rest-api","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__angular__example1.ts.json index 2f4342b7b..d88c2f350 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ninterface MasterRow {\n firstName: string;\n lastName: string;\n plan: string | null;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n}\n\ninterface DetailRow {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n}\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\nconst MASTER_DATA: MasterRow[] = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string => {\n return typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n};\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst DETAIL_COLUMN_MAP: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-sync-two-grids',\n template: `\n
    \n
    \n

    Master grid (editable)

    \n \n
    \n
    \n

    Detail grid (synced)

    \n \n
    \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild('masterGrid', { static: false }) masterHotTable!: HotTableComponent;\n @ViewChild('detailGrid', { static: false }) detailHotTable!: HotTableComponent;\n\n readonly masterData: MasterRow[] = MASTER_DATA;\n readonly detailData: DetailRow[] = MASTER_DATA.map(toDetailRow);\n\n readonly masterSettings: GridSettings = {\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (!changes || (source as string) === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const masterHot = this.masterHotTable?.hotInstance;\n const detailHot = this.detailHotTable?.hotInstance;\n\n if (!masterHot || !detailHot) {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n const detailRow = toDetailRow(rowData);\n const updates = (Object.entries(DETAIL_COLUMN_MAP) as [keyof DetailRow, number][])\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, DetailRow[keyof DetailRow]]);\n\n detailHot.setDataAtCell(updates, SOURCE_SYNC_FROM_MASTER);\n });\n },\n };\n\n readonly detailSettings: GridSettings = {\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/angular/example1.ts","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ninterface MasterRow {\n firstName: string;\n lastName: string;\n plan: string | null;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n}\n\ninterface DetailRow {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n}\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\nconst MASTER_DATA: MasterRow[] = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string => {\n return typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n};\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst DETAIL_COLUMN_MAP: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-sync-two-grids',\n template: `\n
    \n
    \n

    Master grid (editable)

    \n \n
    \n
    \n

    Detail grid (synced)

    \n \n
    \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild('masterGrid', { static: false }) masterHotTable!: HotTableComponent;\n @ViewChild('detailGrid', { static: false }) detailHotTable!: HotTableComponent;\n\n readonly masterData: MasterRow[] = MASTER_DATA;\n readonly detailData: DetailRow[] = MASTER_DATA.map(toDetailRow);\n\n readonly masterSettings: GridSettings = {\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (!changes || (source as string) === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const masterHot = this.masterHotTable?.hotInstance;\n const detailHot = this.detailHotTable?.hotInstance;\n\n if (!masterHot || !detailHot) {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n const detailRow = toDetailRow(rowData);\n const updates = (Object.entries(DETAIL_COLUMN_MAP) as [keyof DetailRow, number][])\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, DetailRow[keyof DetailRow]]);\n\n detailHot.setDataAtCell(updates, SOURCE_SYNC_FROM_MASTER);\n });\n },\n };\n\n readonly detailSettings: GridSettings = {\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/angular/example1.ts","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.js.json index a45a12169..1ed93c851 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\nconst normalizePlanLabel = (plan) => typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName, lastName) => [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats, pricePerSeat) =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row) => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst appContainer = document.querySelector('#example1');\n\nif (!appContainer) {\n throw new Error('Missing #example1 container.');\n}\n\nappContainer.innerHTML = `\n
    \n
    \n

    Master grid (editable)

    \n
    \n
    \n
    \n

    Detail grid (synced)

    \n
    \n
    \n
    \n`;\n\nconst masterContainer = appContainer.querySelector('#master-grid');\nconst detailContainer = appContainer.querySelector('#detail-grid');\n\nconst detailHot = new Handsontable(detailContainer, {\n data: masterData.map(toDetailRow),\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst detailColumnMap = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst syncDetailRow = (rowIndex, rowData) => {\n const detailRow = toDetailRow(rowData);\n\n // Batch updates to avoid multiple render cycles for one row sync.\n const detailChanges = Object.entries(detailColumnMap)\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]]);\n\n detailHot.setDataAtCell(detailChanges, SOURCE_SYNC_FROM_MASTER);\n};\n\nconst masterHot = new Handsontable(masterContainer, {\n data: masterData,\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes, source) => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex);\n\n syncDetailRow(rowIndex, rowData);\n });\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// eslint-disable-next-line no-unused-vars\nconst hotInstances = { masterHot, detailHot };","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/javascript/example1.js","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\nconst normalizePlanLabel = (plan) => typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName, lastName) => [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats, pricePerSeat) =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row) => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst appContainer = document.querySelector('#example1');\n\nif (!appContainer) {\n throw new Error('Missing #example1 container.');\n}\n\nappContainer.innerHTML = `\n
    \n
    \n

    Master grid (editable)

    \n
    \n
    \n
    \n

    Detail grid (synced)

    \n
    \n
    \n
    \n`;\n\nconst masterContainer = appContainer.querySelector('#master-grid');\nconst detailContainer = appContainer.querySelector('#detail-grid');\n\nconst detailHot = new Handsontable(detailContainer, {\n data: masterData.map(toDetailRow),\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst detailColumnMap = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst syncDetailRow = (rowIndex, rowData) => {\n const detailRow = toDetailRow(rowData);\n\n // Batch updates to avoid multiple render cycles for one row sync.\n const detailChanges = Object.entries(detailColumnMap)\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]]);\n\n detailHot.setDataAtCell(detailChanges, SOURCE_SYNC_FROM_MASTER);\n};\n\nconst masterHot = new Handsontable(masterContainer, {\n data: masterData,\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes, source) => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex);\n\n syncDetailRow(rowIndex, rowData);\n });\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// eslint-disable-next-line no-unused-vars\nconst hotInstances = { masterHot, detailHot };","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/javascript/example1.js","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.ts.json index b0b9c7e8e..5a679399c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ninterface MasterRow {\n firstName: string;\n lastName: string;\n plan: string | null;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n}\n\ninterface DetailRow {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n}\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData: MasterRow[] = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string =>\n typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst appContainer = document.querySelector('#example1') as HTMLDivElement;\n\nif (!appContainer) {\n throw new Error('Missing #example1 container.');\n}\n\nappContainer.innerHTML = `\n
    \n
    \n

    Master grid (editable)

    \n
    \n
    \n
    \n

    Detail grid (synced)

    \n
    \n
    \n
    \n`;\n\nconst masterContainer = appContainer.querySelector('#master-grid') as HTMLDivElement;\nconst detailContainer = appContainer.querySelector('#detail-grid') as HTMLDivElement;\n\nconst detailHot = new Handsontable(detailContainer, {\n data: masterData.map(toDetailRow),\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst detailColumnMap: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst syncDetailRow = (rowIndex: number, rowData: MasterRow) => {\n const detailRow = toDetailRow(rowData);\n\n // Batch updates into one call to avoid multiple render passes.\n const updates = (Object.entries(detailColumnMap) as [keyof DetailRow, number][])\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, DetailRow[keyof DetailRow]]);\n\n detailHot.setDataAtCell(updates, SOURCE_SYNC_FROM_MASTER);\n};\n\nconst masterHot = new Handsontable(masterContainer, {\n data: masterData,\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes, source) => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n\n syncDetailRow(rowIndex, rowData);\n });\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// eslint-disable-next-line no-unused-vars\nconst hotInstances = { masterHot, detailHot };","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ninterface MasterRow {\n firstName: string;\n lastName: string;\n plan: string | null;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n}\n\ninterface DetailRow {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n}\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData: MasterRow[] = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string =>\n typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst appContainer = document.querySelector('#example1') as HTMLDivElement;\n\nif (!appContainer) {\n throw new Error('Missing #example1 container.');\n}\n\nappContainer.innerHTML = `\n
    \n
    \n

    Master grid (editable)

    \n
    \n
    \n
    \n

    Detail grid (synced)

    \n
    \n
    \n
    \n`;\n\nconst masterContainer = appContainer.querySelector('#master-grid') as HTMLDivElement;\nconst detailContainer = appContainer.querySelector('#detail-grid') as HTMLDivElement;\n\nconst detailHot = new Handsontable(detailContainer, {\n data: masterData.map(toDetailRow),\n colHeaders: ['Customer', 'Plan', 'Seats', 'Monthly revenue', 'Last active'],\n columns: [\n { data: 'customer', readOnly: true, width: 170 },\n { data: 'plan', readOnly: true, width: 130 },\n { data: 'seats', readOnly: true, type: 'numeric', width: 70 },\n { data: 'monthlyRevenue', readOnly: true, width: 130 },\n { data: 'lastActive', readOnly: true, width: 110 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst detailColumnMap: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst syncDetailRow = (rowIndex: number, rowData: MasterRow) => {\n const detailRow = toDetailRow(rowData);\n\n // Batch updates into one call to avoid multiple render passes.\n const updates = (Object.entries(detailColumnMap) as [keyof DetailRow, number][])\n .map(([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, DetailRow[keyof DetailRow]]);\n\n detailHot.setDataAtCell(updates, SOURCE_SYNC_FROM_MASTER);\n};\n\nconst masterHot = new Handsontable(masterContainer, {\n data: masterData,\n colHeaders: ['First name', 'Last name', 'Plan', 'Seats', 'Price / seat', 'Last active'],\n columns: [\n { data: 'firstName', type: 'text', width: 120 },\n { data: 'lastName', type: 'text', width: 120 },\n { data: 'plan', type: 'dropdown', source: ['Starter', 'Team', 'Business', 'Enterprise'], width: 130 },\n { data: 'seats', type: 'numeric', width: 70 },\n { data: 'pricePerSeat', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 105 },\n { data: 'lastActive', type: 'date', width: 130 },\n ],\n rowHeaders: true,\n height: 260,\n width: '100%',\n autoWrapRow: true,\n stretchH: 'all',\n afterChange: (changes, source) => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n\n syncDetailRow(rowIndex, rowData);\n });\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// eslint-disable-next-line no-unused-vars\nconst hotInstances = { masterHot, detailHot };","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__react__example1.tsx.json index fb7e93997..294b8a1f5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__sync-two-grids__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\ntype MasterRow = {\n firstName: string;\n lastName: string;\n plan: string;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n};\n\ntype DetailRow = {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n};\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string =>\n typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst detailColumnMap: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst ExampleComponent = () => {\n const masterHotRef = useRef(null);\n const detailHotRef = useRef(null);\n\n const syncDetailRow = (rowIndex: number, rowData: MasterRow): void => {\n const detailHot = detailHotRef.current?.hotInstance;\n\n if (!detailHot) {\n return;\n }\n\n const detailRow = toDetailRow(rowData);\n const detailChanges = (Object.entries(detailColumnMap) as [keyof DetailRow, number][]).map(\n ([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, unknown]\n );\n\n detailHot.setDataAtCell(detailChanges, SOURCE_SYNC_FROM_MASTER);\n };\n\n const handleMasterAfterChange = (changes: [number, string | number, unknown, unknown][] | null, source: string): void => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const masterHot = masterHotRef.current?.hotInstance;\n\n if (!masterHot) {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n\n syncDetailRow(rowIndex, rowData);\n });\n };\n\n return (\n
    \n
    \n

    Master grid (editable)

    \n \n
    \n
    \n

    Detail grid (synced)

    \n \n
    \n
    \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/react/example1.tsx","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Sync two grids · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\nconst SOURCE_SYNC_FROM_MASTER = 'sync-from-master';\n\n/* start:skip-in-preview */\nconst masterData = [\n { firstName: 'Mia', lastName: 'Johnson', plan: 'Starter', seats: 5, pricePerSeat: 29, lastActive: '2026-03-09' },\n { firstName: 'Noah', lastName: 'Chen', plan: 'Team', seats: 12, pricePerSeat: 24, lastActive: '2026-03-10' },\n { firstName: 'Ava', lastName: 'Miller', plan: 'Business', seats: 18, pricePerSeat: 21, lastActive: '2026-03-08' },\n { firstName: 'Liam', lastName: 'Davis', plan: 'Enterprise', seats: 35, pricePerSeat: 19, lastActive: '2026-03-11' },\n { firstName: 'Emma', lastName: 'Wilson', plan: 'Team', seats: 9, pricePerSeat: 24, lastActive: '2026-03-06' },\n { firstName: 'Oliver', lastName: 'Khan', plan: 'Starter', seats: 4, pricePerSeat: 29, lastActive: '2026-03-07' },\n { firstName: 'Sophia', lastName: 'Lee', plan: 'Business', seats: 22, pricePerSeat: 21, lastActive: '2026-03-05' },\n { firstName: 'James', lastName: 'Patel', plan: 'Team', seats: 14, pricePerSeat: 24, lastActive: '2026-03-12' },\n { firstName: 'Isabella', lastName: 'Rossi', plan: 'Starter', seats: 6, pricePerSeat: 29, lastActive: '2026-03-04' },\n { firstName: 'Benjamin', lastName: 'Garcia', plan: 'Enterprise', seats: 41, pricePerSeat: 19, lastActive: '2026-03-03' },\n { firstName: 'Charlotte', lastName: 'Nguyen', plan: 'Business', seats: 19, pricePerSeat: 21, lastActive: '2026-03-02' },\n { firstName: 'Elijah', lastName: 'Brown', plan: 'Team', seats: 11, pricePerSeat: 24, lastActive: '2026-03-01' },\n];\n/* end:skip-in-preview */\n\ntype MasterRow = {\n firstName: string;\n lastName: string;\n plan: string;\n seats: number;\n pricePerSeat: number;\n lastActive: string;\n};\n\ntype DetailRow = {\n customer: string;\n plan: string;\n seats: number;\n monthlyRevenue: string;\n lastActive: string;\n};\n\nconst normalizePlanLabel = (plan: MasterRow['plan']): string =>\n typeof plan === 'string' ? plan.toUpperCase() : 'N/A';\n\nconst normalizeCustomer = (firstName: string | null, lastName: string | null): string =>\n [firstName, lastName].filter(Boolean).join(' ');\n\nconst normalizeMonthlyRevenue = (seats: number | null, pricePerSeat: number | null): string =>\n `$${((seats ?? 0) * (pricePerSeat ?? 0)).toFixed(2)}`;\n\nconst toDetailRow = (row: MasterRow): DetailRow => ({\n customer: normalizeCustomer(row.firstName, row.lastName),\n plan: normalizePlanLabel(row.plan),\n seats: row.seats,\n monthlyRevenue: normalizeMonthlyRevenue(row.seats, row.pricePerSeat),\n lastActive: row.lastActive ?? '',\n});\n\nconst detailColumnMap: Record = {\n customer: 0,\n plan: 1,\n seats: 2,\n monthlyRevenue: 3,\n lastActive: 4,\n};\n\nconst ExampleComponent = () => {\n const masterHotRef = useRef(null);\n const detailHotRef = useRef(null);\n\n const syncDetailRow = (rowIndex: number, rowData: MasterRow): void => {\n const detailHot = detailHotRef.current?.hotInstance;\n\n if (!detailHot) {\n return;\n }\n\n const detailRow = toDetailRow(rowData);\n const detailChanges = (Object.entries(detailColumnMap) as [keyof DetailRow, number][]).map(\n ([prop, columnIndex]) => [rowIndex, columnIndex, detailRow[prop]] as [number, number, unknown]\n );\n\n detailHot.setDataAtCell(detailChanges, SOURCE_SYNC_FROM_MASTER);\n };\n\n const handleMasterAfterChange = (changes: [number, string | number, unknown, unknown][] | null, source: string): void => {\n // Ignore init/sync writes to prevent re-entrant updates.\n if (!changes || source === SOURCE_SYNC_FROM_MASTER || source === 'loadData') {\n return;\n }\n\n const masterHot = masterHotRef.current?.hotInstance;\n\n if (!masterHot) {\n return;\n }\n\n const changedRows = new Set();\n\n changes.forEach(([row]) => {\n if (typeof row === 'number') {\n changedRows.add(row);\n }\n });\n\n changedRows.forEach((rowIndex) => {\n const rowData = masterHot.getSourceDataAtRow(rowIndex) as MasterRow;\n\n syncDetailRow(rowIndex, rowData);\n });\n };\n\n return (\n
    \n
    \n

    Master grid (editable)

    \n \n
    \n
    \n

    Detail grid (synced)

    \n \n
    \n
    \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".sync-grids-layout {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n\n.sync-grids-card {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 4px;\n padding: 8px;\n background: var(--sl-color-gray-7, #f5f5f5);\n}\n\n.sync-grids-card h4 {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n@media (max-width: 960px) {\n .sync-grids-layout {\n grid-template-columns: 1fr;\n }\n}"},"docsPath":"recipes/data-management/sync-two-grids/react/example1.tsx","breadcrumb":["Recipes","Data Management","Sync two grids"],"guide":"recipes/data-management/sync-two-grids/sync-two-grids.md","guideTitle":"Sync two grids","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/sync-two-grids","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__angular__example1.ts.json index 8da211b85..d96a8470c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-undo-redo-custom-ui',\n template: `\n
    \n
    \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isUndoAvailable = false;\n isRedoAvailable = false;\n\n readonly hotData = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (source !== 'loadData') {\n this.updateButtonsState();\n }\n },\n afterUndo: () => {\n this.updateButtonsState();\n },\n afterRedo: () => {\n this.updateButtonsState();\n },\n };\n\n updateButtonsState(): void {\n const undoRedoPlugin = this.hotTable?.hotInstance?.getPlugin('undoRedo');\n\n if (undoRedoPlugin) {\n this.isUndoAvailable = undoRedoPlugin.isUndoAvailable();\n this.isRedoAvailable = undoRedoPlugin.isRedoAvailable();\n }\n }\n\n undo(): void {\n this.hotTable?.hotInstance?.getPlugin('undoRedo').undo();\n this.updateButtonsState();\n }\n\n redo(): void {\n this.hotTable?.hotInstance?.getPlugin('undoRedo').redo();\n this.updateButtonsState();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/undo-redo-custom-ui/angular/example1.ts","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-undo-redo-custom-ui',\n template: `\n
    \n
    \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n isUndoAvailable = false;\n isRedoAvailable = false;\n\n readonly hotData = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n ];\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if (source !== 'loadData') {\n this.updateButtonsState();\n }\n },\n afterUndo: () => {\n this.updateButtonsState();\n },\n afterRedo: () => {\n this.updateButtonsState();\n },\n };\n\n updateButtonsState(): void {\n const undoRedoPlugin = this.hotTable?.hotInstance?.getPlugin('undoRedo');\n\n if (undoRedoPlugin) {\n this.isUndoAvailable = undoRedoPlugin.isUndoAvailable();\n this.isRedoAvailable = undoRedoPlugin.isRedoAvailable();\n }\n }\n\n undo(): void {\n this.hotTable?.hotInstance?.getPlugin('undoRedo').undo();\n this.updateButtonsState();\n }\n\n redo(): void {\n this.hotTable?.hotInstance?.getPlugin('undoRedo').redo();\n this.updateButtonsState();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/data-management/undo-redo-custom-ui/angular/example1.ts","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.js.json index b10ab2fee..c2b8f0149 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\nconst rootContainer = document.querySelector('#example1');\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const gridContainer = document.createElement('div');\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n const undoButton = document.createElement('button');\n const redoButton = document.createElement('button');\n undoButton.type = 'button';\n undoButton.textContent = 'Undo';\n redoButton.type = 'button';\n redoButton.textContent = 'Redo';\n controls.appendChild(undoButton);\n controls.appendChild(redoButton);\n toolbar.appendChild(controls);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n undo: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes, source) => {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n },\n afterUndo: () => {\n updateButtonsState();\n },\n afterRedo: () => {\n updateButtonsState();\n },\n licenseKey: 'non-commercial-and-evaluation',\n });\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n function updateButtonsState() {\n undoButton.disabled = !undoRedoPlugin.isUndoAvailable();\n redoButton.disabled = !undoRedoPlugin.isRedoAvailable();\n }\n undoButton.addEventListener('click', () => {\n undoRedoPlugin.undo();\n updateButtonsState();\n });\n redoButton.addEventListener('click', () => {\n undoRedoPlugin.redo();\n updateButtonsState();\n });\n updateButtonsState();\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/undo-redo-custom-ui/javascript/example1.js","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\nconst rootContainer = document.querySelector('#example1');\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const gridContainer = document.createElement('div');\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n const undoButton = document.createElement('button');\n const redoButton = document.createElement('button');\n undoButton.type = 'button';\n undoButton.textContent = 'Undo';\n redoButton.type = 'button';\n redoButton.textContent = 'Redo';\n controls.appendChild(undoButton);\n controls.appendChild(redoButton);\n toolbar.appendChild(controls);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n undo: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes, source) => {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n },\n afterUndo: () => {\n updateButtonsState();\n },\n afterRedo: () => {\n updateButtonsState();\n },\n licenseKey: 'non-commercial-and-evaluation',\n });\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n function updateButtonsState() {\n undoButton.disabled = !undoRedoPlugin.isUndoAvailable();\n redoButton.disabled = !undoRedoPlugin.isRedoAvailable();\n }\n undoButton.addEventListener('click', () => {\n undoRedoPlugin.undo();\n updateButtonsState();\n });\n redoButton.addEventListener('click', () => {\n undoRedoPlugin.redo();\n updateButtonsState();\n });\n updateButtonsState();\n}","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/data-management/undo-redo-custom-ui/javascript/example1.js","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.ts.json index a8e90d7fe..465c81f72 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1');\n\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const gridContainer = document.createElement('div');\n\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n\n const undoButton = document.createElement('button');\n const redoButton = document.createElement('button');\n\n undoButton.type = 'button';\n undoButton.textContent = 'Undo';\n redoButton.type = 'button';\n redoButton.textContent = 'Redo';\n\n controls.appendChild(undoButton);\n controls.appendChild(redoButton);\n toolbar.appendChild(controls);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n undo: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes, source) => {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n },\n afterUndo: () => {\n updateButtonsState();\n },\n afterRedo: () => {\n updateButtonsState();\n },\n licenseKey: 'non-commercial-and-evaluation',\n });\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n\n function updateButtonsState() {\n undoButton.disabled = !undoRedoPlugin.isUndoAvailable();\n redoButton.disabled = !undoRedoPlugin.isRedoAvailable();\n }\n\n undoButton.addEventListener('click', () => {\n undoRedoPlugin.undo();\n updateButtonsState();\n });\n\n redoButton.addEventListener('click', () => {\n undoRedoPlugin.redo();\n updateButtonsState();\n });\n\n updateButtonsState();\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/undo-redo-custom-ui/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1');\n\nif (rootContainer instanceof HTMLElement) {\n const toolbar = document.createElement('div');\n const controls = document.createElement('div');\n const gridContainer = document.createElement('div');\n\n toolbar.className = 'example-controls-container';\n controls.className = 'controls';\n\n const undoButton = document.createElement('button');\n const redoButton = document.createElement('button');\n\n undoButton.type = 'button';\n undoButton.textContent = 'Undo';\n redoButton.type = 'button';\n redoButton.textContent = 'Redo';\n\n controls.appendChild(undoButton);\n controls.appendChild(redoButton);\n toolbar.appendChild(controls);\n rootContainer.appendChild(toolbar);\n rootContainer.appendChild(gridContainer);\n\n const hot = new Handsontable(gridContainer, {\n data,\n colHeaders: ['ID', 'Task', 'Status', 'Owner'],\n rowHeaders: true,\n width: '100%',\n height: 'auto',\n autoWrapRow: true,\n autoWrapCol: true,\n undo: true,\n columns: [\n { data: 'id', type: 'numeric', width: 60, readOnly: true },\n { data: 'task', type: 'text', width: 220 },\n { data: 'status', type: 'text', width: 130 },\n { data: 'owner', type: 'text', width: 120 },\n ],\n afterChange: (_changes, source) => {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n },\n afterUndo: () => {\n updateButtonsState();\n },\n afterRedo: () => {\n updateButtonsState();\n },\n licenseKey: 'non-commercial-and-evaluation',\n });\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n\n function updateButtonsState() {\n undoButton.disabled = !undoRedoPlugin.isUndoAvailable();\n redoButton.disabled = !undoRedoPlugin.isRedoAvailable();\n }\n\n undoButton.addEventListener('click', () => {\n undoRedoPlugin.undo();\n updateButtonsState();\n });\n\n redoButton.addEventListener('click', () => {\n undoRedoPlugin.redo();\n updateButtonsState();\n });\n\n updateButtonsState();\n}","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/data-management/undo-redo-custom-ui/javascript/example1.ts","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__react__example1.tsx.json index 1b8c69ad7..ee7604979 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__data-management__undo-redo-custom-ui__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [undoDisabled, setUndoDisabled] = useState(true);\n const [redoDisabled, setRedoDisabled] = useState(true);\n\n const updateButtonsState = (): void => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n\n setUndoDisabled(!undoRedoPlugin.isUndoAvailable());\n setRedoDisabled(!undoRedoPlugin.isRedoAvailable());\n };\n\n const handleUndo = (): void => {\n hotRef.current?.hotInstance?.getPlugin('undoRedo').undo();\n updateButtonsState();\n };\n\n const handleRedo = (): void => {\n hotRef.current?.hotInstance?.getPlugin('undoRedo').redo();\n updateButtonsState();\n };\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n }}\n afterUndo={updateButtonsState}\n afterRedo={updateButtonsState}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/undo-redo-custom-ui/react/example1.tsx","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Data Management ▸ Undo / redo with a custom UI · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n { id: 1, task: 'Write release notes', status: 'Done', owner: 'Mia' },\n { id: 2, task: 'Update API docs', status: 'In progress', owner: 'Owen' },\n { id: 3, task: 'Review recipes', status: 'Blocked', owner: 'Lena' },\n { id: 4, task: 'Ship hotfix', status: 'Done', owner: 'Kai' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const [undoDisabled, setUndoDisabled] = useState(true);\n const [redoDisabled, setRedoDisabled] = useState(true);\n\n const updateButtonsState = (): void => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const undoRedoPlugin = hot.getPlugin('undoRedo');\n\n setUndoDisabled(!undoRedoPlugin.isUndoAvailable());\n setRedoDisabled(!undoRedoPlugin.isRedoAvailable());\n };\n\n const handleUndo = (): void => {\n hotRef.current?.hotInstance?.getPlugin('undoRedo').undo();\n updateButtonsState();\n };\n\n const handleRedo = (): void => {\n hotRef.current?.hotInstance?.getPlugin('undoRedo').redo();\n updateButtonsState();\n };\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n {\n if (source !== 'loadData') {\n updateButtonsState();\n }\n }}\n afterUndo={updateButtonsState}\n afterRedo={updateButtonsState}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/data-management/undo-redo-custom-ui/react/example1.tsx","breadcrumb":["Recipes","Data Management","Undo / redo with a custom UI"],"guide":"recipes/data-management/undo-redo-custom-ui/undo-redo-custom-ui.md","guideTitle":"Undo / redo with a custom UI","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/data-management/undo-redo-custom-ui","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__angular__example1.ts.json index 953327805..ffadd4a6b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: ['Apple', 'Banana', 'Orange'],\n Vegetable: ['Carrot', 'Pea', 'Broccoli'],\n Grain: ['Rice', 'Wheat', 'Oats'],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-dependent-dropdowns',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['Fruit', 'Apple'],\n ['Vegetable', 'Carrot'],\n ['Grain', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Category', 'Subcategory'],\n columns: [\n { type: 'dropdown', source: Object.keys(dependencyMap) },\n { type: 'dropdown', source: optionsForCategory(String(this.data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: '100%',\n afterInit(this: Handsontable) {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? '');\n this.setCellMeta(row, SUBCATEGORY_COL, 'source', optionsForCategory(category));\n }\n this.render();\n },\n afterChange(this: Handsontable, changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source === 'loadData' || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, 'source', next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? '');\n }\n this.render();\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/editing-validation/dependent-dropdowns/angular/example1.ts","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: ['Apple', 'Banana', 'Orange'],\n Vegetable: ['Carrot', 'Pea', 'Broccoli'],\n Grain: ['Rice', 'Wheat', 'Oats'],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-dependent-dropdowns',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data: string[][] = [\n ['Fruit', 'Apple'],\n ['Vegetable', 'Carrot'],\n ['Grain', ''],\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Category', 'Subcategory'],\n columns: [\n { type: 'dropdown', source: Object.keys(dependencyMap) },\n { type: 'dropdown', source: optionsForCategory(String(this.data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: '100%',\n afterInit(this: Handsontable) {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? '');\n this.setCellMeta(row, SUBCATEGORY_COL, 'source', optionsForCategory(category));\n }\n this.render();\n },\n afterChange(this: Handsontable, changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) {\n if (source === 'loadData' || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, 'source', next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? '');\n }\n this.render();\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/editing-validation/dependent-dropdowns/angular/example1.ts","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.js.json index b9d7288df..a239001e8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap = {\n Fruit: [\"Apple\", \"Banana\", \"Orange\"],\n Vegetable: [\"Carrot\", \"Pea\", \"Broccoli\"],\n Grain: [\"Rice\", \"Wheat\", \"Oats\"],\n};\nfunction optionsForCategory(category) {\n return dependencyMap[category] ?? [];\n}\n/* start:skip-in-preview */\nconst data = [\n [\"Fruit\", \"Apple\"],\n [\"Vegetable\", \"Carrot\"],\n [\"Grain\", \"\"],\n];\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\n// eslint-disable-next-line no-unused-vars -- instance kept for recipe preview\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"Category\", \"Subcategory\"],\n columns: [\n { type: \"dropdown\", source: Object.keys(dependencyMap) },\n { type: \"dropdown\", source: optionsForCategory(String(data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterInit() {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? \"\");\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", optionsForCategory(category));\n }\n this.render();\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? \"\");\n }\n this.render();\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/editing-validation/dependent-dropdowns/javascript/example1.js","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap = {\n Fruit: [\"Apple\", \"Banana\", \"Orange\"],\n Vegetable: [\"Carrot\", \"Pea\", \"Broccoli\"],\n Grain: [\"Rice\", \"Wheat\", \"Oats\"],\n};\nfunction optionsForCategory(category) {\n return dependencyMap[category] ?? [];\n}\n/* start:skip-in-preview */\nconst data = [\n [\"Fruit\", \"Apple\"],\n [\"Vegetable\", \"Carrot\"],\n [\"Grain\", \"\"],\n];\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\n// eslint-disable-next-line no-unused-vars -- instance kept for recipe preview\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"Category\", \"Subcategory\"],\n columns: [\n { type: \"dropdown\", source: Object.keys(dependencyMap) },\n { type: \"dropdown\", source: optionsForCategory(String(data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterInit() {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? \"\");\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", optionsForCategory(category));\n }\n this.render();\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? \"\");\n }\n this.render();\n },\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/editing-validation/dependent-dropdowns/javascript/example1.js","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.ts.json index 3d0fe27be..f7b1905a8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\n\nregisterAllModules();\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: [\"Apple\", \"Banana\", \"Orange\"],\n Vegetable: [\"Carrot\", \"Pea\", \"Broccoli\"],\n Grain: [\"Rice\", \"Wheat\", \"Oats\"],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n/* start:skip-in-preview */\nconst data = [\n [\"Fruit\", \"Apple\"],\n [\"Vegetable\", \"Carrot\"],\n [\"Grain\", \"\"],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\n// eslint-disable-next-line no-unused-vars -- instance kept for recipe preview\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"Category\", \"Subcategory\"],\n columns: [\n { type: \"dropdown\", source: Object.keys(dependencyMap) },\n { type: \"dropdown\", source: optionsForCategory(String(data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterInit() {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? \"\");\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", optionsForCategory(category));\n }\n this.render();\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? \"\");\n }\n this.render();\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/editing-validation/dependent-dropdowns/javascript/example1.ts","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\n\nregisterAllModules();\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: [\"Apple\", \"Banana\", \"Orange\"],\n Vegetable: [\"Carrot\", \"Pea\", \"Broccoli\"],\n Grain: [\"Rice\", \"Wheat\", \"Oats\"],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n/* start:skip-in-preview */\nconst data = [\n [\"Fruit\", \"Apple\"],\n [\"Vegetable\", \"Carrot\"],\n [\"Grain\", \"\"],\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\n// eslint-disable-next-line no-unused-vars -- instance kept for recipe preview\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"Category\", \"Subcategory\"],\n columns: [\n { type: \"dropdown\", source: Object.keys(dependencyMap) },\n { type: \"dropdown\", source: optionsForCategory(String(data[0][CATEGORY_COL])) },\n ],\n rowHeaders: true,\n height: 200,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterInit() {\n for (let row = 0; row < this.countRows(); row++) {\n const category = String(this.getDataAtCell(row, CATEGORY_COL) ?? \"\");\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", optionsForCategory(category));\n }\n this.render();\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n const next = optionsForCategory(String(newVal));\n this.setCellMeta(row, SUBCATEGORY_COL, \"source\", next);\n this.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? \"\");\n }\n this.render();\n },\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/editing-validation/dependent-dropdowns/javascript/example1.ts","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__react__example1.tsx.json index a2d2194d7..27b3de310 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__dependent-dropdowns__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\nregisterAllModules();\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: ['Apple', 'Banana', 'Orange'],\n Vegetable: ['Carrot', 'Pea', 'Broccoli'],\n Grain: ['Rice', 'Wheat', 'Oats'],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n/* start:skip-in-preview */\nconst data: string[][] = [\n ['Fruit', 'Apple'],\n ['Vegetable', 'Carrot'],\n ['Grain', ''],\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n function afterInit(this: Handsontable): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n for (let row = 0; row < hot.countRows(); row++) {\n const category = String(hot.getDataAtCell(row, CATEGORY_COL) ?? '');\n\n hot.setCellMeta(row, SUBCATEGORY_COL, 'source', optionsForCategory(category));\n }\n\n hot.render();\n }\n\n function afterChange(\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot || source === 'loadData' || !changes) {\n return;\n }\n\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n\n const next = optionsForCategory(String(newVal));\n\n hot.setCellMeta(row, SUBCATEGORY_COL, 'source', next);\n hot.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? '');\n }\n\n hot.render();\n }\n\n return (\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/editing-validation/dependent-dropdowns/react/example1.tsx","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Editing Validation ▸ Dependent dropdowns · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\n\nregisterAllModules();\n\nconst CATEGORY_COL = 0;\nconst SUBCATEGORY_COL = 1;\n\n/** Parent value -> allowed child dropdown labels */\nconst dependencyMap: Record = {\n Fruit: ['Apple', 'Banana', 'Orange'],\n Vegetable: ['Carrot', 'Pea', 'Broccoli'],\n Grain: ['Rice', 'Wheat', 'Oats'],\n};\n\nfunction optionsForCategory(category: string): string[] {\n return dependencyMap[category] ?? [];\n}\n\n/* start:skip-in-preview */\nconst data: string[][] = [\n ['Fruit', 'Apple'],\n ['Vegetable', 'Carrot'],\n ['Grain', ''],\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n function afterInit(this: Handsontable): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n for (let row = 0; row < hot.countRows(); row++) {\n const category = String(hot.getDataAtCell(row, CATEGORY_COL) ?? '');\n\n hot.setCellMeta(row, SUBCATEGORY_COL, 'source', optionsForCategory(category));\n }\n\n hot.render();\n }\n\n function afterChange(\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot || source === 'loadData' || !changes) {\n return;\n }\n\n for (const change of changes) {\n const [row, prop, oldVal, newVal] = change;\n\n if (prop !== CATEGORY_COL || oldVal === newVal) {\n continue;\n }\n\n const next = optionsForCategory(String(newVal));\n\n hot.setCellMeta(row, SUBCATEGORY_COL, 'source', next);\n hot.setDataAtCell(row, SUBCATEGORY_COL, next[0] ?? '');\n }\n\n hot.render();\n }\n\n return (\n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/editing-validation/dependent-dropdowns/react/example1.tsx","breadcrumb":["Recipes","Editing Validation","Dependent dropdowns"],"guide":"recipes/editing-validation/dependent-dropdowns/dependent-dropdowns.md","guideTitle":"Dependent dropdowns","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/dependent-dropdowns","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__angular__example1.ts.json index 5e190a68e..aa366687a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst COLUMN_LABELS = ['Item', 'Quantity', 'Unit price'];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record string | null> = {\n 0: (value) => {\n const text = String(value ?? '').trim();\n return text.length > 0 ? null : 'Item name is required';\n },\n 1: (value) => {\n if (value === null || value === '') {\n return 'Quantity is required';\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : 'Quantity must be a positive whole number';\n },\n 2: (value) => {\n if (value === null || value === '') {\n return 'Unit price is required';\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 ? null : 'Unit price must be greater than 0';\n },\n};\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-row-validation-error-summary',\n template: `\n
    \n
    \n \n
    \n
    \n \n
    \n

    Validation issues

    \n
      \n @for (issue of issues; track $index) {\n
    • Row {{ issue.row + 1 }}, {{ columnLabels[issue.col] }}: {{ issue.message }}
    • \n }\n
    \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly columnLabels = COLUMN_LABELS;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n invalidCells = new Set();\n issues: { row: number; col: number; message: string }[] = [];\n\n readonly data = [\n { item: 'Widget A', qty: 2, price: 19.99 },\n { item: '', qty: 1, price: 5 },\n { item: 'Gadget', qty: -1, price: 12 },\n { item: 'Cable', qty: 3, price: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: 'item', type: 'text', width: 180 },\n { data: 'qty', type: 'numeric', width: 100 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n afterRenderer: (TD: HTMLTableCellElement, row: number, col: number) => {\n TD.style.backgroundColor = this.invalidCells.has(cellKey(row, col))\n ? 'var(--ht-cell-error-background-color, #ffe4e4)'\n : '';\n },\n afterChange: (changes: Handsontable.CellChange[] | null, source: string) => {\n if (source === 'loadData' || !changes) {\n return;\n }\n let touched = false;\n const hot = this.hotTable?.hotInstance;\n if (!hot) {\n return;\n }\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === 'string' ? hot.propToCol(prop) : (prop as number);\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n const key = cellKey(row, col);\n if (!this.invalidCells.has(key)) {\n continue;\n }\n hot.removeCellMeta(row, col, 'className');\n hot.removeCellMeta(row, col, 'title');\n this.invalidCells.delete(key);\n this.issues = this.issues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n if (touched) {\n this.cdr.detectChanges();\n hot.render();\n }\n },\n };\n\n onSubmit(): void {\n const hot = this.hotTable?.hotInstance;\n if (!hot) {\n return;\n }\n\n this.invalidCells.forEach((key) => {\n const [r, c] = key.split(':').map(Number);\n hot.removeCellMeta(r, c, 'className');\n hot.removeCellMeta(r, c, 'title');\n });\n this.invalidCells.clear();\n\n const newIssues: { row: number; col: number; message: string }[] = [];\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n if (!rule) {\n continue;\n }\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n if (message !== null) {\n newIssues.push({ row, col, message });\n }\n }\n }\n\n this.issues = newIssues;\n\n newIssues.forEach((issue) => {\n hot.setCellMeta(issue.row, issue.col, 'className', 'htInvalid');\n hot.setCellMeta(issue.row, issue.col, 'title', issue.message);\n this.invalidCells.add(cellKey(issue.row, issue.col));\n });\n\n this.cdr.detectChanges();\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/angular/example1.ts","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ChangeDetectorRef, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst COLUMN_LABELS = ['Item', 'Quantity', 'Unit price'];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record string | null> = {\n 0: (value) => {\n const text = String(value ?? '').trim();\n return text.length > 0 ? null : 'Item name is required';\n },\n 1: (value) => {\n if (value === null || value === '') {\n return 'Quantity is required';\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : 'Quantity must be a positive whole number';\n },\n 2: (value) => {\n if (value === null || value === '') {\n return 'Unit price is required';\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 ? null : 'Unit price must be greater than 0';\n },\n};\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-row-validation-error-summary',\n template: `\n
    \n
    \n \n
    \n
    \n \n
    \n

    Validation issues

    \n
      \n @for (issue of issues; track $index) {\n
    • Row {{ issue.row + 1 }}, {{ columnLabels[issue.col] }}: {{ issue.message }}
    • \n }\n
    \n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly columnLabels = COLUMN_LABELS;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n invalidCells = new Set();\n issues: { row: number; col: number; message: string }[] = [];\n\n readonly data = [\n { item: 'Widget A', qty: 2, price: 19.99 },\n { item: '', qty: 1, price: 5 },\n { item: 'Gadget', qty: -1, price: 12 },\n { item: 'Cable', qty: 3, price: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: 'item', type: 'text', width: 180 },\n { data: 'qty', type: 'numeric', width: 100 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n afterRenderer: (TD: HTMLTableCellElement, row: number, col: number) => {\n TD.style.backgroundColor = this.invalidCells.has(cellKey(row, col))\n ? 'var(--ht-cell-error-background-color, #ffe4e4)'\n : '';\n },\n afterChange: (changes: Handsontable.CellChange[] | null, source: string) => {\n if (source === 'loadData' || !changes) {\n return;\n }\n let touched = false;\n const hot = this.hotTable?.hotInstance;\n if (!hot) {\n return;\n }\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === 'string' ? hot.propToCol(prop) : (prop as number);\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n const key = cellKey(row, col);\n if (!this.invalidCells.has(key)) {\n continue;\n }\n hot.removeCellMeta(row, col, 'className');\n hot.removeCellMeta(row, col, 'title');\n this.invalidCells.delete(key);\n this.issues = this.issues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n if (touched) {\n this.cdr.detectChanges();\n hot.render();\n }\n },\n };\n\n onSubmit(): void {\n const hot = this.hotTable?.hotInstance;\n if (!hot) {\n return;\n }\n\n this.invalidCells.forEach((key) => {\n const [r, c] = key.split(':').map(Number);\n hot.removeCellMeta(r, c, 'className');\n hot.removeCellMeta(r, c, 'title');\n });\n this.invalidCells.clear();\n\n const newIssues: { row: number; col: number; message: string }[] = [];\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n if (!rule) {\n continue;\n }\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n if (message !== null) {\n newIssues.push({ row, col, message });\n }\n }\n }\n\n this.issues = newIssues;\n\n newIssues.forEach((issue) => {\n hot.setCellMeta(issue.row, issue.col, 'className', 'htInvalid');\n hot.setCellMeta(issue.row, issue.col, 'title', issue.message);\n this.invalidCells.add(cellKey(issue.row, issue.col));\n });\n\n this.cdr.detectChanges();\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/angular/example1.ts","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.js.json index ea100e2d1..83705db06 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst COLUMN_LABELS = [\"Item\", \"Quantity\", \"Unit price\"];\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules = {\n 0: (value) => {\n const text = String(value ?? \"\").trim();\n return text.length > 0 ? null : \"Item name is required\";\n },\n 1: (value) => {\n if (value === null || value === \"\") {\n return \"Quantity is required\";\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : \"Quantity must be a positive whole number\";\n },\n 2: (value) => {\n if (value === null || value === \"\") {\n return \"Unit price is required\";\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 ? null : \"Unit price must be greater than 0\";\n },\n};\nconst invalidCells = new Set();\nlet lastIssues = [];\nfunction cellKey(row, col) {\n return `${row}:${col}`;\n}\nconst container = document.querySelector(\"#example1\");\nconst toolbar = document.createElement(\"div\");\ntoolbar.className = \"example-controls-container\";\nconst controlsRow = document.createElement(\"div\");\ncontrolsRow.className = \"controls\";\nconst submitBtn = document.createElement(\"button\");\nsubmitBtn.type = \"button\";\nsubmitBtn.textContent = \"Submit orders\";\ncontrolsRow.appendChild(submitBtn);\ntoolbar.appendChild(controlsRow);\ncontainer.before(toolbar);\nconst summaryEl = document.createElement(\"div\");\nsummaryEl.className = \"example-controls-container validation-summary\";\nsummaryEl.setAttribute(\"aria-live\", \"polite\");\nconst summaryTitle = document.createElement(\"p\");\nsummaryTitle.className = \"validation-summary__title\";\nsummaryTitle.textContent = \"Validation issues\";\nconst summaryList = document.createElement(\"ul\");\nsummaryList.className = \"validation-summary__list\";\nsummaryEl.appendChild(summaryTitle);\nsummaryEl.appendChild(summaryList);\ncontainer.after(summaryEl);\nfunction renderSummary(issues) {\n summaryList.innerHTML = issues\n .map((issue) => `
  • Row ${issue.row + 1}, ${COLUMN_LABELS[issue.col]}: ${issue.message}
  • `)\n .join(\"\");\n}\nfunction clearHighlights(instance) {\n invalidCells.forEach((key) => {\n const [r, c] = key.split(\":\").map(Number);\n instance.removeCellMeta(r, c, \"className\");\n instance.removeCellMeta(r, c, \"title\");\n });\n invalidCells.clear();\n}\nfunction applyHighlights(instance, issues) {\n issues.forEach((issue) => {\n instance.setCellMeta(issue.row, issue.col, \"className\", \"htInvalid\");\n instance.setCellMeta(issue.row, issue.col, \"title\", issue.message);\n invalidCells.add(cellKey(issue.row, issue.col));\n });\n instance.render();\n}\nconst hot = new Handsontable(container, {\n data: [\n { item: \"Widget A\", qty: 2, price: 19.99 },\n { item: \"\", qty: 1, price: 5 },\n { item: \"Gadget\", qty: -1, price: 12 },\n { item: \"Cable\", qty: 3, price: 0 },\n ],\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: \"item\", type: \"text\", width: 180 },\n { data: \"qty\", type: \"numeric\", width: 100 },\n { data: \"price\", type: \"numeric\", numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterRenderer(TD, row, col) {\n TD.style.backgroundColor = invalidCells.has(cellKey(row, col))\n ? \"var(--ht-cell-error-background-color, #ffe4e4)\"\n : \"\";\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n let touched = false;\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === \"string\" ? this.propToCol(prop) : prop;\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n const key = cellKey(row, col);\n if (!invalidCells.has(key)) {\n continue;\n }\n this.removeCellMeta(row, col, \"className\");\n this.removeCellMeta(row, col, \"title\");\n invalidCells.delete(key);\n lastIssues = lastIssues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n if (touched) {\n renderSummary(lastIssues);\n this.render();\n }\n },\n});\nsubmitBtn.addEventListener(\"click\", () => {\n clearHighlights(hot);\n const issues = [];\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n if (!rule) {\n continue;\n }\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n if (message !== null) {\n issues.push({ row, col, message });\n }\n }\n }\n lastIssues = issues;\n renderSummary(issues);\n applyHighlights(hot, issues);\n});\nrenderSummary([]);\n// eslint-disable-next-line no-unused-vars -- instance wired by event handlers and closures\nvoid hot;","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n#example1 .handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/javascript/example1.js","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst COLUMN_LABELS = [\"Item\", \"Quantity\", \"Unit price\"];\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules = {\n 0: (value) => {\n const text = String(value ?? \"\").trim();\n return text.length > 0 ? null : \"Item name is required\";\n },\n 1: (value) => {\n if (value === null || value === \"\") {\n return \"Quantity is required\";\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : \"Quantity must be a positive whole number\";\n },\n 2: (value) => {\n if (value === null || value === \"\") {\n return \"Unit price is required\";\n }\n const n = Number(value);\n return !Number.isNaN(n) && n > 0 ? null : \"Unit price must be greater than 0\";\n },\n};\nconst invalidCells = new Set();\nlet lastIssues = [];\nfunction cellKey(row, col) {\n return `${row}:${col}`;\n}\nconst container = document.querySelector(\"#example1\");\nconst toolbar = document.createElement(\"div\");\ntoolbar.className = \"example-controls-container\";\nconst controlsRow = document.createElement(\"div\");\ncontrolsRow.className = \"controls\";\nconst submitBtn = document.createElement(\"button\");\nsubmitBtn.type = \"button\";\nsubmitBtn.textContent = \"Submit orders\";\ncontrolsRow.appendChild(submitBtn);\ntoolbar.appendChild(controlsRow);\ncontainer.before(toolbar);\nconst summaryEl = document.createElement(\"div\");\nsummaryEl.className = \"example-controls-container validation-summary\";\nsummaryEl.setAttribute(\"aria-live\", \"polite\");\nconst summaryTitle = document.createElement(\"p\");\nsummaryTitle.className = \"validation-summary__title\";\nsummaryTitle.textContent = \"Validation issues\";\nconst summaryList = document.createElement(\"ul\");\nsummaryList.className = \"validation-summary__list\";\nsummaryEl.appendChild(summaryTitle);\nsummaryEl.appendChild(summaryList);\ncontainer.after(summaryEl);\nfunction renderSummary(issues) {\n summaryList.innerHTML = issues\n .map((issue) => `
  • Row ${issue.row + 1}, ${COLUMN_LABELS[issue.col]}: ${issue.message}
  • `)\n .join(\"\");\n}\nfunction clearHighlights(instance) {\n invalidCells.forEach((key) => {\n const [r, c] = key.split(\":\").map(Number);\n instance.removeCellMeta(r, c, \"className\");\n instance.removeCellMeta(r, c, \"title\");\n });\n invalidCells.clear();\n}\nfunction applyHighlights(instance, issues) {\n issues.forEach((issue) => {\n instance.setCellMeta(issue.row, issue.col, \"className\", \"htInvalid\");\n instance.setCellMeta(issue.row, issue.col, \"title\", issue.message);\n invalidCells.add(cellKey(issue.row, issue.col));\n });\n instance.render();\n}\nconst hot = new Handsontable(container, {\n data: [\n { item: \"Widget A\", qty: 2, price: 19.99 },\n { item: \"\", qty: 1, price: 5 },\n { item: \"Gadget\", qty: -1, price: 12 },\n { item: \"Cable\", qty: 3, price: 0 },\n ],\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: \"item\", type: \"text\", width: 180 },\n { data: \"qty\", type: \"numeric\", width: 100 },\n { data: \"price\", type: \"numeric\", numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterRenderer(TD, row, col) {\n TD.style.backgroundColor = invalidCells.has(cellKey(row, col))\n ? \"var(--ht-cell-error-background-color, #ffe4e4)\"\n : \"\";\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n let touched = false;\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === \"string\" ? this.propToCol(prop) : prop;\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n const key = cellKey(row, col);\n if (!invalidCells.has(key)) {\n continue;\n }\n this.removeCellMeta(row, col, \"className\");\n this.removeCellMeta(row, col, \"title\");\n invalidCells.delete(key);\n lastIssues = lastIssues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n if (touched) {\n renderSummary(lastIssues);\n this.render();\n }\n },\n});\nsubmitBtn.addEventListener(\"click\", () => {\n clearHighlights(hot);\n const issues = [];\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n if (!rule) {\n continue;\n }\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n if (message !== null) {\n issues.push({ row, col, message });\n }\n }\n }\n lastIssues = issues;\n renderSummary(issues);\n applyHighlights(hot, issues);\n});\nrenderSummary([]);\n// eslint-disable-next-line no-unused-vars -- instance wired by event handlers and closures\nvoid hot;","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n#example1 .handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/javascript/example1.js","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.ts.json index dd28d65e7..905d51293 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\n\nregisterAllModules();\n\ntype ValidationRule = (value: unknown) => string | null;\n\nconst COLUMN_LABELS = [\"Item\", \"Quantity\", \"Unit price\"];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record = {\n 0: (value) => {\n const text = String(value ?? \"\").trim();\n\n return text.length > 0 ? null : \"Item name is required\";\n },\n 1: (value) => {\n if (value === null || value === \"\") {\n return \"Quantity is required\";\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : \"Quantity must be a positive whole number\";\n },\n 2: (value) => {\n if (value === null || value === \"\") {\n return \"Unit price is required\";\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 ? null : \"Unit price must be greater than 0\";\n },\n};\n\ninterface ValidationIssue {\n row: number;\n col: number;\n message: string;\n}\n\nconst invalidCells = new Set();\nlet lastIssues: ValidationIssue[] = [];\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst toolbar = document.createElement(\"div\");\n\ntoolbar.className = \"example-controls-container\";\n\nconst controlsRow = document.createElement(\"div\");\n\ncontrolsRow.className = \"controls\";\n\nconst submitBtn = document.createElement(\"button\");\n\nsubmitBtn.type = \"button\";\nsubmitBtn.textContent = \"Submit orders\";\n\ncontrolsRow.appendChild(submitBtn);\ntoolbar.appendChild(controlsRow);\ncontainer.before(toolbar);\n\nconst summaryEl = document.createElement(\"div\");\n\nsummaryEl.className = \"example-controls-container validation-summary\";\nsummaryEl.setAttribute(\"aria-live\", \"polite\");\n\nconst summaryTitle = document.createElement(\"p\");\n\nsummaryTitle.className = \"validation-summary__title\";\nsummaryTitle.textContent = \"Validation issues\";\n\nconst summaryList = document.createElement(\"ul\");\n\nsummaryList.className = \"validation-summary__list\";\n\nsummaryEl.appendChild(summaryTitle);\nsummaryEl.appendChild(summaryList);\ncontainer.after(summaryEl);\n\nfunction renderSummary(issues: ValidationIssue[]): void {\n summaryList.innerHTML = issues\n .map(\n (issue) =>\n `
  • Row ${issue.row + 1}, ${COLUMN_LABELS[issue.col]}: ${issue.message}
  • `,\n )\n .join(\"\");\n}\n\nfunction clearHighlights(instance: Handsontable): void {\n invalidCells.forEach((key) => {\n const [r, c] = key.split(\":\").map(Number);\n\n instance.removeCellMeta(r, c, \"className\");\n instance.removeCellMeta(r, c, \"title\");\n });\n invalidCells.clear();\n}\n\nfunction applyHighlights(instance: Handsontable, issues: ValidationIssue[]): void {\n issues.forEach((issue) => {\n instance.setCellMeta(issue.row, issue.col, \"className\", \"htInvalid\");\n instance.setCellMeta(issue.row, issue.col, \"title\", issue.message);\n invalidCells.add(cellKey(issue.row, issue.col));\n });\n instance.render();\n}\n\nconst hot = new Handsontable(container, {\n data: [\n { item: \"Widget A\", qty: 2, price: 19.99 },\n { item: \"\", qty: 1, price: 5 },\n { item: \"Gadget\", qty: -1, price: 12 },\n { item: \"Cable\", qty: 3, price: 0 },\n ],\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: \"item\", type: \"text\", width: 180 },\n { data: \"qty\", type: \"numeric\", width: 100 },\n { data: \"price\", type: \"numeric\", numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterRenderer(TD, row, col) {\n TD.style.backgroundColor = invalidCells.has(cellKey(row, col))\n ? \"var(--ht-cell-error-background-color, #ffe4e4)\"\n : \"\";\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n\n let touched = false;\n\n for (const change of changes) {\n const [row, prop] = change;\n const col =\n typeof prop === \"string\" ? this.propToCol(prop) : (prop as number);\n\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n\n const key = cellKey(row, col);\n\n if (!invalidCells.has(key)) {\n continue;\n }\n\n this.removeCellMeta(row, col, \"className\");\n this.removeCellMeta(row, col, \"title\");\n invalidCells.delete(key);\n lastIssues = lastIssues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n\n if (touched) {\n renderSummary(lastIssues);\n this.render();\n }\n },\n});\n\nsubmitBtn.addEventListener(\"click\", () => {\n clearHighlights(hot);\n\n const issues: ValidationIssue[] = [];\n\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n\n if (!rule) {\n continue;\n }\n\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n\n if (message !== null) {\n issues.push({ row, col, message });\n }\n }\n }\n\n lastIssues = issues;\n renderSummary(issues);\n applyHighlights(hot, issues);\n});\n\nrenderSummary([]);\n\n// eslint-disable-next-line no-unused-vars -- instance wired by event handlers and closures\nvoid hot;","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n#example1 .handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/javascript/example1.ts","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\n\nregisterAllModules();\n\ntype ValidationRule = (value: unknown) => string | null;\n\nconst COLUMN_LABELS = [\"Item\", \"Quantity\", \"Unit price\"];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record = {\n 0: (value) => {\n const text = String(value ?? \"\").trim();\n\n return text.length > 0 ? null : \"Item name is required\";\n },\n 1: (value) => {\n if (value === null || value === \"\") {\n return \"Quantity is required\";\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : \"Quantity must be a positive whole number\";\n },\n 2: (value) => {\n if (value === null || value === \"\") {\n return \"Unit price is required\";\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 ? null : \"Unit price must be greater than 0\";\n },\n};\n\ninterface ValidationIssue {\n row: number;\n col: number;\n message: string;\n}\n\nconst invalidCells = new Set();\nlet lastIssues: ValidationIssue[] = [];\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst toolbar = document.createElement(\"div\");\n\ntoolbar.className = \"example-controls-container\";\n\nconst controlsRow = document.createElement(\"div\");\n\ncontrolsRow.className = \"controls\";\n\nconst submitBtn = document.createElement(\"button\");\n\nsubmitBtn.type = \"button\";\nsubmitBtn.textContent = \"Submit orders\";\n\ncontrolsRow.appendChild(submitBtn);\ntoolbar.appendChild(controlsRow);\ncontainer.before(toolbar);\n\nconst summaryEl = document.createElement(\"div\");\n\nsummaryEl.className = \"example-controls-container validation-summary\";\nsummaryEl.setAttribute(\"aria-live\", \"polite\");\n\nconst summaryTitle = document.createElement(\"p\");\n\nsummaryTitle.className = \"validation-summary__title\";\nsummaryTitle.textContent = \"Validation issues\";\n\nconst summaryList = document.createElement(\"ul\");\n\nsummaryList.className = \"validation-summary__list\";\n\nsummaryEl.appendChild(summaryTitle);\nsummaryEl.appendChild(summaryList);\ncontainer.after(summaryEl);\n\nfunction renderSummary(issues: ValidationIssue[]): void {\n summaryList.innerHTML = issues\n .map(\n (issue) =>\n `
  • Row ${issue.row + 1}, ${COLUMN_LABELS[issue.col]}: ${issue.message}
  • `,\n )\n .join(\"\");\n}\n\nfunction clearHighlights(instance: Handsontable): void {\n invalidCells.forEach((key) => {\n const [r, c] = key.split(\":\").map(Number);\n\n instance.removeCellMeta(r, c, \"className\");\n instance.removeCellMeta(r, c, \"title\");\n });\n invalidCells.clear();\n}\n\nfunction applyHighlights(instance: Handsontable, issues: ValidationIssue[]): void {\n issues.forEach((issue) => {\n instance.setCellMeta(issue.row, issue.col, \"className\", \"htInvalid\");\n instance.setCellMeta(issue.row, issue.col, \"title\", issue.message);\n invalidCells.add(cellKey(issue.row, issue.col));\n });\n instance.render();\n}\n\nconst hot = new Handsontable(container, {\n data: [\n { item: \"Widget A\", qty: 2, price: 19.99 },\n { item: \"\", qty: 1, price: 5 },\n { item: \"Gadget\", qty: -1, price: 12 },\n { item: \"Cable\", qty: 3, price: 0 },\n ],\n colHeaders: COLUMN_LABELS,\n columns: [\n { data: \"item\", type: \"text\", width: 180 },\n { data: \"qty\", type: \"numeric\", width: 100 },\n { data: \"price\", type: \"numeric\", numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 }, width: 110 },\n ],\n rowHeaders: true,\n height: \"auto\",\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n afterRenderer(TD, row, col) {\n TD.style.backgroundColor = invalidCells.has(cellKey(row, col))\n ? \"var(--ht-cell-error-background-color, #ffe4e4)\"\n : \"\";\n },\n afterChange(changes, source) {\n if (source === \"loadData\" || !changes) {\n return;\n }\n\n let touched = false;\n\n for (const change of changes) {\n const [row, prop] = change;\n const col =\n typeof prop === \"string\" ? this.propToCol(prop) : (prop as number);\n\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n\n const key = cellKey(row, col);\n\n if (!invalidCells.has(key)) {\n continue;\n }\n\n this.removeCellMeta(row, col, \"className\");\n this.removeCellMeta(row, col, \"title\");\n invalidCells.delete(key);\n lastIssues = lastIssues.filter((i) => !(i.row === row && i.col === col));\n touched = true;\n }\n\n if (touched) {\n renderSummary(lastIssues);\n this.render();\n }\n },\n});\n\nsubmitBtn.addEventListener(\"click\", () => {\n clearHighlights(hot);\n\n const issues: ValidationIssue[] = [];\n\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n\n if (!rule) {\n continue;\n }\n\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n\n if (message !== null) {\n issues.push({ row, col, message });\n }\n }\n }\n\n lastIssues = issues;\n renderSummary(issues);\n applyHighlights(hot, issues);\n});\n\nrenderSummary([]);\n\n// eslint-disable-next-line no-unused-vars -- instance wired by event handlers and closures\nvoid hot;","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n#example1 .handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/javascript/example1.ts","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__react__example1.tsx.json index 8f8ee6388..97a2dd4b3 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__editing-validation__row-validation-error-summary__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\nconst COLUMN_LABELS = ['Item', 'Quantity', 'Unit price'];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record string | null> = {\n 0: (value) => {\n const text = String(value ?? '').trim();\n\n return text.length > 0 ? null : 'Item name is required';\n },\n 1: (value) => {\n if (value === null || value === '') {\n return 'Quantity is required';\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : 'Quantity must be a positive whole number';\n },\n 2: (value) => {\n if (value === null || value === '') {\n return 'Unit price is required';\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 ? null : 'Unit price must be greater than 0';\n },\n};\n\ninterface Issue {\n row: number;\n col: number;\n message: string;\n}\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\nconst initialData = [\n { item: 'Widget A', qty: 2, price: 19.99 },\n { item: '', qty: 1, price: 5 },\n { item: 'Gadget', qty: -1, price: 12 },\n { item: 'Cable', qty: 3, price: 0 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const invalidCellsRef = useRef>(new Set());\n const [issues, setIssues] = useState([]);\n\n function afterRenderer(TD: HTMLTableCellElement, row: number, col: number): void {\n TD.style.backgroundColor = invalidCellsRef.current.has(cellKey(row, col))\n ? 'var(--ht-cell-error-background-color, #ffe4e4)'\n : '';\n }\n\n function afterChange(\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot || source === 'loadData' || !changes) {\n return;\n }\n\n let touched = false;\n\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === 'string' ? hot.propToCol(prop) : (prop as number);\n\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n\n const key = cellKey(row, col);\n\n if (!invalidCellsRef.current.has(key)) {\n continue;\n }\n\n hot.removeCellMeta(row, col, 'className');\n hot.removeCellMeta(row, col, 'title');\n invalidCellsRef.current.delete(key);\n touched = true;\n }\n\n if (touched) {\n setIssues((prev) =>\n prev.filter((i) => invalidCellsRef.current.has(cellKey(i.row, i.col)))\n );\n hot.render();\n }\n }\n\n function handleSubmit(): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n invalidCellsRef.current.forEach((key) => {\n const [r, c] = key.split(':').map(Number);\n\n hot.removeCellMeta(r, c, 'className');\n hot.removeCellMeta(r, c, 'title');\n });\n invalidCellsRef.current.clear();\n\n const newIssues: Issue[] = [];\n\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n\n if (!rule) {\n continue;\n }\n\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n\n if (message !== null) {\n newIssues.push({ row, col, message });\n }\n }\n }\n\n newIssues.forEach((issue) => {\n hot.setCellMeta(issue.row, issue.col, 'className', 'htInvalid');\n hot.setCellMeta(issue.row, issue.col, 'title', issue.message);\n invalidCellsRef.current.add(cellKey(issue.row, issue.col));\n });\n\n hot.render();\n setIssues(newIssues);\n }\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n
    \n

    Validation issues

    \n
      \n {issues.map((issue) => (\n
    • \n Row {issue.row + 1}, {COLUMN_LABELS[issue.col]}: {issue.message}\n
    • \n ))}\n
    \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/react/example1.tsx","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Editing Validation ▸ Row validation with error summary · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\nconst COLUMN_LABELS = ['Item', 'Quantity', 'Unit price'];\n\n/** Column index -> returns `null` when valid, otherwise an error message. */\nconst validationRules: Record string | null> = {\n 0: (value) => {\n const text = String(value ?? '').trim();\n\n return text.length > 0 ? null : 'Item name is required';\n },\n 1: (value) => {\n if (value === null || value === '') {\n return 'Quantity is required';\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 && Number.isInteger(n)\n ? null\n : 'Quantity must be a positive whole number';\n },\n 2: (value) => {\n if (value === null || value === '') {\n return 'Unit price is required';\n }\n\n const n = Number(value);\n\n return !Number.isNaN(n) && n > 0 ? null : 'Unit price must be greater than 0';\n },\n};\n\ninterface Issue {\n row: number;\n col: number;\n message: string;\n}\n\nfunction cellKey(row: number, col: number): string {\n return `${row}:${col}`;\n}\n\nconst initialData = [\n { item: 'Widget A', qty: 2, price: 19.99 },\n { item: '', qty: 1, price: 5 },\n { item: 'Gadget', qty: -1, price: 12 },\n { item: 'Cable', qty: 3, price: 0 },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const invalidCellsRef = useRef>(new Set());\n const [issues, setIssues] = useState([]);\n\n function afterRenderer(TD: HTMLTableCellElement, row: number, col: number): void {\n TD.style.backgroundColor = invalidCellsRef.current.has(cellKey(row, col))\n ? 'var(--ht-cell-error-background-color, #ffe4e4)'\n : '';\n }\n\n function afterChange(\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot || source === 'loadData' || !changes) {\n return;\n }\n\n let touched = false;\n\n for (const change of changes) {\n const [row, prop] = change;\n const col = typeof prop === 'string' ? hot.propToCol(prop) : (prop as number);\n\n // Skip a property that names no column.\n if (col === null) {\n continue;\n }\n\n const key = cellKey(row, col);\n\n if (!invalidCellsRef.current.has(key)) {\n continue;\n }\n\n hot.removeCellMeta(row, col, 'className');\n hot.removeCellMeta(row, col, 'title');\n invalidCellsRef.current.delete(key);\n touched = true;\n }\n\n if (touched) {\n setIssues((prev) =>\n prev.filter((i) => invalidCellsRef.current.has(cellKey(i.row, i.col)))\n );\n hot.render();\n }\n }\n\n function handleSubmit(): void {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n invalidCellsRef.current.forEach((key) => {\n const [r, c] = key.split(':').map(Number);\n\n hot.removeCellMeta(r, c, 'className');\n hot.removeCellMeta(r, c, 'title');\n });\n invalidCellsRef.current.clear();\n\n const newIssues: Issue[] = [];\n\n for (let row = 0; row < hot.countRows(); row++) {\n for (let col = 0; col < hot.countCols(); col++) {\n const rule = validationRules[col];\n\n if (!rule) {\n continue;\n }\n\n const value = hot.getDataAtCell(row, col);\n const message = rule(value);\n\n if (message !== null) {\n newIssues.push({ row, col, message });\n }\n }\n }\n\n newIssues.forEach((issue) => {\n hot.setCellMeta(issue.row, issue.col, 'className', 'htInvalid');\n hot.setCellMeta(issue.row, issue.col, 'title', issue.message);\n invalidCellsRef.current.add(cellKey(issue.row, issue.col));\n });\n\n hot.render();\n setIssues(newIssues);\n }\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n
    \n

    Validation issues

    \n
      \n {issues.map((issue) => (\n
    • \n Row {issue.row + 1}, {COLUMN_LABELS[issue.col]}: {issue.message}\n
    • \n ))}\n
    \n
    \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".row-validation-demo {\n display: flex;\n flex-direction: column;\n gap: var(--ht-gap, 12px);\n width: 100%;\n}\n\n.row-validation-demo__toolbar {\n display: flex;\n flex-wrap: wrap;\n gap: var(--ht-gap, 8px);\n align-items: center;\n margin-bottom: 0.75rem;\n}\n\n.row-validation-demo__toolbar button {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-bg-nav, #ffffff);\n color: var(--sl-color-text, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n line-height: 1.2;\n padding: 0.4rem 0.75rem;\n border-radius: 4px;\n cursor: pointer;\n transition: color 0.15s, background-color 0.15s, border-color 0.15s;\n}\n\n.row-validation-demo__toolbar button:not(:disabled):hover {\n color: var(--sl-color-white, #333333);\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.row-validation-demo__toolbar button:focus-visible {\n outline: 1px solid var(--sl-color-accent, #1A42E8);\n outline-offset: 1px;\n}\n\n.row-validation-demo__toolbar button:disabled {\n color: var(--sl-color-gray-3, #777777);\n border-color: var(--sl-color-gray-5, #e0e0e0);\n background: var(--sl-color-gray-7, #f5f5f5);\n opacity: 0.8;\n cursor: not-allowed;\n}\n\n.row-validation-demo__summary {\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n padding: 0.75rem 1rem;\n background: var(--sl-color-bg-nav, #ffffff);\n}\n\n.row-validation-demo__summary-title {\n margin: 0 0 0.5rem;\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list {\n list-style: none;\n margin: 0;\n padding-left: 1.25rem;\n font-size: var(--sl-text-sm, 0.875rem);\n color: var(--sl-color-text, #333333);\n}\n\n.validation-summary__list:empty::before {\n content: 'No issues. Click Submit orders to validate.';\n display: block;\n margin-left: -1.25rem;\n color: var(--sl-color-gray-3, #777777);\n}\n\n.handsontable td.htInvalid {\n background-color: var(--ht-cell-error-background-color, #ffe4e4) !important;\n}"},"docsPath":"recipes/editing-validation/row-validation-error-summary/react/example1.tsx","breadcrumb":["Recipes","Editing Validation","Row validation with error summary"],"guide":"recipes/editing-validation/row-validation-error-summary/row-validation-error-summary.md","guideTitle":"Row validation with error summary","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/editing-validation/row-validation-error-summary","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__angular__example1.ts.json index 537042ea7..59df404d1 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-external-search-box',\n template: `\n
    \n
    \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n };\n\n private debounceTimer: ReturnType | undefined;\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('search').query(value);\n hot.render();\n }, 120);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-and-search/external-search-box/angular/example1.ts","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-external-search-box',\n template: `\n
    \n
    \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n };\n\n private debounceTimer: ReturnType | undefined;\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('search').query(value);\n hot.render();\n }, 120);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-and-search/external-search-box/angular/example1.ts","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.js.json index 7d5a1591b..57cd541be 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst exampleContainer = document.querySelector('#example1');\n\nconst searchWrapper = document.createElement('div');\nsearchWrapper.className = 'example-controls-container';\n\nconst controlsDiv = document.createElement('div');\ncontrolsDiv.className = 'controls';\n\nconst searchLabel = document.createElement('label');\nsearchLabel.setAttribute('for', 'external-search-input');\nsearchLabel.textContent = 'Search rows';\n\nconst searchInput = document.createElement('input');\nsearchInput.id = 'external-search-input';\nsearchInput.type = 'search';\nsearchInput.placeholder = 'Type to highlight matching cells...';\n\nconst hotContainer = document.createElement('div');\n\ncontrolsDiv.appendChild(searchLabel);\ncontrolsDiv.appendChild(searchInput);\nsearchWrapper.appendChild(controlsDiv);\nexampleContainer.appendChild(searchWrapper);\nexampleContainer.appendChild(hotContainer);\n\nconst hot = new Handsontable(hotContainer, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debounce = (callback, delay = 120) => {\n let timeoutId;\n\n return (...args) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => callback(...args), delay);\n };\n};\n\nconst runSearch = debounce((value) => {\n const searchPlugin = hot.getPlugin('search');\n\n searchPlugin.query(value);\n hot.render();\n});\n\nsearchInput.addEventListener('input', (event) => {\n runSearch(event.target.value);\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/javascript/example1.js","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst exampleContainer = document.querySelector('#example1');\n\nconst searchWrapper = document.createElement('div');\nsearchWrapper.className = 'example-controls-container';\n\nconst controlsDiv = document.createElement('div');\ncontrolsDiv.className = 'controls';\n\nconst searchLabel = document.createElement('label');\nsearchLabel.setAttribute('for', 'external-search-input');\nsearchLabel.textContent = 'Search rows';\n\nconst searchInput = document.createElement('input');\nsearchInput.id = 'external-search-input';\nsearchInput.type = 'search';\nsearchInput.placeholder = 'Type to highlight matching cells...';\n\nconst hotContainer = document.createElement('div');\n\ncontrolsDiv.appendChild(searchLabel);\ncontrolsDiv.appendChild(searchInput);\nsearchWrapper.appendChild(controlsDiv);\nexampleContainer.appendChild(searchWrapper);\nexampleContainer.appendChild(hotContainer);\n\nconst hot = new Handsontable(hotContainer, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debounce = (callback, delay = 120) => {\n let timeoutId;\n\n return (...args) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => callback(...args), delay);\n };\n};\n\nconst runSearch = debounce((value) => {\n const searchPlugin = hot.getPlugin('search');\n\n searchPlugin.query(value);\n hot.render();\n});\n\nsearchInput.addEventListener('input', (event) => {\n runSearch(event.target.value);\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/javascript/example1.js","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.ts.json index 7b37e7d40..e0336825f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst exampleContainer = document.querySelector('#example1');\n\nif (!exampleContainer) {\n throw new Error('Example container not found.');\n}\n\nconst searchWrapper = document.createElement('div');\nsearchWrapper.className = 'example-controls-container';\n\nconst controlsDiv = document.createElement('div');\ncontrolsDiv.className = 'controls';\n\nconst searchLabel = document.createElement('label');\nsearchLabel.setAttribute('for', 'external-search-input');\nsearchLabel.textContent = 'Search rows';\n\nconst searchInput = document.createElement('input');\nsearchInput.id = 'external-search-input';\nsearchInput.type = 'search';\nsearchInput.placeholder = 'Type to highlight matching cells...';\n\nconst hotContainer = document.createElement('div');\n\ncontrolsDiv.appendChild(searchLabel);\ncontrolsDiv.appendChild(searchInput);\nsearchWrapper.appendChild(controlsDiv);\nexampleContainer.appendChild(searchWrapper);\nexampleContainer.appendChild(hotContainer);\n\nconst hot = new Handsontable(hotContainer, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debounce = void>(callback: T, delay = 120) => {\n let timeoutId: ReturnType | undefined;\n\n return (...args: Parameters) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => callback(...args), delay);\n };\n};\n\nconst runSearch = debounce((value: string) => {\n const searchPlugin = hot.getPlugin('search');\n\n searchPlugin.query(value);\n hot.render();\n});\n\nsearchInput.addEventListener('input', (event) => {\n runSearch((event.target as HTMLInputElement).value);\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/javascript/example1.ts","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst exampleContainer = document.querySelector('#example1');\n\nif (!exampleContainer) {\n throw new Error('Example container not found.');\n}\n\nconst searchWrapper = document.createElement('div');\nsearchWrapper.className = 'example-controls-container';\n\nconst controlsDiv = document.createElement('div');\ncontrolsDiv.className = 'controls';\n\nconst searchLabel = document.createElement('label');\nsearchLabel.setAttribute('for', 'external-search-input');\nsearchLabel.textContent = 'Search rows';\n\nconst searchInput = document.createElement('input');\nsearchInput.id = 'external-search-input';\nsearchInput.type = 'search';\nsearchInput.placeholder = 'Type to highlight matching cells...';\n\nconst hotContainer = document.createElement('div');\n\ncontrolsDiv.appendChild(searchLabel);\ncontrolsDiv.appendChild(searchInput);\nsearchWrapper.appendChild(controlsDiv);\nexampleContainer.appendChild(searchWrapper);\nexampleContainer.appendChild(hotContainer);\n\nconst hot = new Handsontable(hotContainer, {\n data,\n rowHeaders: true,\n colHeaders: ['Name', 'Team', 'Location', 'Email'],\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n autoWrapCol: true,\n search: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst debounce = void>(callback: T, delay = 120) => {\n let timeoutId: ReturnType | undefined;\n\n return (...args: Parameters) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => callback(...args), delay);\n };\n};\n\nconst runSearch = debounce((value: string) => {\n const searchPlugin = hot.getPlugin('search');\n\n searchPlugin.query(value);\n hot.render();\n});\n\nsearchInput.addEventListener('input', (event) => {\n runSearch((event.target as HTMLInputElement).value);\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/javascript/example1.ts","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__react__example1.tsx.json index dc602079b..9d8611a9c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__external-search-box__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst debounce = (callback: (...args: unknown[]) => void, delay = 120) => {\n let timeoutId: ReturnType;\n\n return (...args: unknown[]) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => callback(...args), delay);\n };\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const runSearch = useCallback(\n debounce((value: unknown) => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('search').query(String(value));\n hot.render();\n }),\n []\n );\n\n function handleSearchInput(e: React.FormEvent) {\n runSearch(e.currentTarget.value);\n }\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/react/example1.tsx","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Filtering And Search ▸ External search box · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport \"./styles.css\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useCallback } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst data = [\n ['Alice Johnson', 'Engineering', 'Berlin', 'alice.johnson@example.com'],\n ['Noah Smith', 'Design', 'Warsaw', 'noah.smith@example.com'],\n ['Mia Garcia', 'Marketing', 'New York', 'mia.garcia@example.com'],\n ['Liam Brown', 'Engineering', 'Toronto', 'liam.brown@example.com'],\n ['Emma Davis', 'Sales', 'London', 'emma.davis@example.com'],\n ['Oliver Miller', 'Support', 'Madrid', 'oliver.miller@example.com'],\n];\n/* end:skip-in-preview */\n\nconst debounce = (callback: (...args: unknown[]) => void, delay = 120) => {\n let timeoutId: ReturnType;\n\n return (...args: unknown[]) => {\n window.clearTimeout(timeoutId);\n timeoutId = window.setTimeout(() => callback(...args), delay);\n };\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const runSearch = useCallback(\n debounce((value: unknown) => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n hot.getPlugin('search').query(String(value));\n hot.render();\n }),\n []\n );\n\n function handleSearchInput(e: React.FormEvent) {\n runSearch(e.currentTarget.value);\n }\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/styles.css":"#external-search-input {\n min-width: 20rem;\n}"},"docsPath":"recipes/filtering-and-search/external-search-box/react/example1.tsx","breadcrumb":["Recipes","Filtering And Search","External search box"],"guide":"recipes/filtering-and-search/external-search-box/external-search-box.md","guideTitle":"External search box","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/external-search-box","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__angular__example1.ts.json index f18d4aaa6..610132ed0 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { rendererFactory } from 'handsontable/renderers';\n\ntype RowData = {\n id: number;\n title: string;\n owner: string;\n status: string;\n};\n\nconst data: RowData[] = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nlet currentSearchTerm = '';\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n ))\n .join('');\n\n td.innerHTML = highlighted;\n});\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-highlight-search-matches',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n };\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n currentSearchTerm = value;\n hot.getPlugin('search').query(value);\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/angular/example1.ts","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { rendererFactory } from 'handsontable/renderers';\n\ntype RowData = {\n id: number;\n title: string;\n owner: string;\n status: string;\n};\n\nconst data: RowData[] = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nlet currentSearchTerm = '';\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n ))\n .join('');\n\n td.innerHTML = highlighted;\n});\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-highlight-search-matches',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n };\n\n onSearch(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n currentSearchTerm = value;\n hot.getPlugin('search').query(value);\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/angular/example1.ts","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.js.json index 53820c079..073856dec 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nregisterAllModules();\nconst data = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\nlet currentSearchTerm = '';\nfunction escapeRegExp(value) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nfunction escapeHtml(value) {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n return;\n }\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)))\n .join('');\n td.innerHTML = highlighted;\n});\nconst container = document.querySelector('#example1');\nconst searchField = document.querySelector('#search_field');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst searchPlugin = hot.getPlugin('search');\nsearchField.addEventListener('input', (event) => {\n currentSearchTerm = event.target.value;\n searchPlugin.query(currentSearchTerm);\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/javascript/example1.js","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\nregisterAllModules();\nconst data = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\nlet currentSearchTerm = '';\nfunction escapeRegExp(value) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\nfunction escapeHtml(value) {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n return;\n }\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)))\n .join('');\n td.innerHTML = highlighted;\n});\nconst container = document.querySelector('#example1');\nconst searchField = document.querySelector('#search_field');\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});\nconst searchPlugin = hot.getPlugin('search');\nsearchField.addEventListener('input', (event) => {\n currentSearchTerm = event.target.value;\n searchPlugin.query(currentSearchTerm);\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/javascript/example1.js","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.ts.json index 1565140e6..2f8089cc2 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\n\ntype RowData = {\n id: number;\n title: string;\n owner: string;\n status: string;\n};\n\nconst data: RowData[] = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nlet currentSearchTerm = '';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n ))\n .join('');\n\n td.innerHTML = highlighted;\n});\n\nconst container = document.querySelector('#example1')!;\nconst searchField = document.querySelector('#search_field')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchPlugin: Search = hot.getPlugin('search');\n\nsearchField.addEventListener('input', (event) => {\n currentSearchTerm = (event.target as HTMLInputElement).value;\n searchPlugin.query(currentSearchTerm);\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/javascript/example1.ts","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Search } from 'handsontable/plugins';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\n\ntype RowData = {\n id: number;\n title: string;\n owner: string;\n status: string;\n};\n\nconst data: RowData[] = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nlet currentSearchTerm = '';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map(fragment => (\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n ))\n .join('');\n\n td.innerHTML = highlighted;\n});\n\nconst container = document.querySelector('#example1')!;\nconst searchField = document.querySelector('#search_field')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Title', 'Owner', 'Status'],\n rowHeaders: true,\n height: 'auto',\n search: true,\n columns: [\n { data: 'id', type: 'numeric' },\n { data: 'title', renderer: highlightRenderer },\n { data: 'owner', renderer: highlightRenderer },\n { data: 'status', renderer: highlightRenderer },\n ],\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst searchPlugin: Search = hot.getPlugin('search');\n\nsearchField.addEventListener('input', (event) => {\n currentSearchTerm = (event.target as HTMLInputElement).value;\n searchPlugin.query(currentSearchTerm);\n hot.render();\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/javascript/example1.ts","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__react__example1.tsx.json index 36076bfee..e02a7e030 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-and-search__highlight-search-matches__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\n\nconst data = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nlet currentSearchTerm = '';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map((fragment) =>\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n )\n .join('');\n\n td.innerHTML = highlighted;\n});\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n function handleSearchInput(e: React.FormEvent) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n currentSearchTerm = e.currentTarget.value;\n hot.getPlugin('search').query(currentSearchTerm);\n hot.render();\n }\n\n return (\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/react/example1.tsx","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Filtering And Search ▸ Highlight search matches · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { rendererFactory } from 'handsontable/renderers';\n\nregisterAllModules();\n\nconst data = [\n { id: 101, title: 'Search API docs', owner: 'Alex', status: 'In progress' },\n { id: 102, title: 'Renderer refactor', owner: 'Mia', status: 'Review' },\n { id: 103, title: 'Fix keyboard shortcut', owner: 'Noah', status: 'Done' },\n { id: 104, title: 'Search UX tests', owner: 'Ava', status: 'In progress' },\n];\n\nlet currentSearchTerm = '';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nconst highlightRenderer = rendererFactory(({ td, value, cellProperties }) => {\n const cellText = value === null || value === undefined ? '' : String(value);\n const query = currentSearchTerm.trim();\n\n if (!query || !cellProperties.isSearchResult) {\n td.textContent = cellText;\n return;\n }\n\n const splitter = new RegExp(`(${escapeRegExp(query)})`, 'gi');\n const highlighted = cellText\n .split(splitter)\n .map((fragment) =>\n fragment.toLocaleLowerCase() === query.toLocaleLowerCase()\n ? `${escapeHtml(fragment)}`\n : escapeHtml(fragment)\n )\n .join('');\n\n td.innerHTML = highlighted;\n});\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n function handleSearchInput(e: React.FormEvent) {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n currentSearchTerm = e.currentTarget.value;\n hot.getPlugin('search').query(currentSearchTerm);\n hot.render();\n }\n\n return (\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/filtering-and-search/highlight-search-matches/react/example1.tsx","breadcrumb":["Recipes","Filtering And Search","Highlight search matches"],"guide":"recipes/filtering-and-search/highlight-search-matches/highlight-search-matches.md","guideTitle":"Highlight search matches","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-and-search/highlight-search-matches","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__angular__example1.ts.json index 8e393f8f7..c5b211156 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype Product = {\n name: string;\n category: string;\n price: number;\n stock: number;\n};\n\nconst sourceData: Product[] = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-multi-column-filter-panel',\n template: `\n
    \n
    \n \n \n \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = sourceData;\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n enteredName = '';\n selectedCategory = '';\n minPrice = '';\n maxPrice = '';\n\n onNameFilter(event: Event): void {\n this.enteredName = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n onCategoryFilter(event: Event): void {\n this.selectedCategory = (event.target as HTMLSelectElement).value;\n this.applyFilters();\n }\n\n onMinPriceFilter(event: Event): void {\n this.minPrice = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n onMaxPriceFilter(event: Event): void {\n this.maxPrice = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n clearFilters(): void {\n this.enteredName = '';\n this.selectedCategory = '';\n this.minPrice = '';\n this.maxPrice = '';\n\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n }\n\n private applyFilters(): void {\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n\n if (this.enteredName) {\n filtersPlugin.addCondition(0, 'contains', [this.enteredName]);\n }\n\n if (this.selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [this.selectedCategory]);\n }\n\n if (this.minPrice && this.maxPrice) {\n const lowerBound = Number(this.minPrice);\n const upperBound = Number(this.maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (this.minPrice) {\n const lowerBound = Number(this.minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (this.maxPrice) {\n const upperBound = Number(this.maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/angular/example1.ts","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\ntype Product = {\n name: string;\n category: string;\n price: number;\n stock: number;\n};\n\nconst sourceData: Product[] = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-multi-column-filter-panel',\n template: `\n
    \n
    \n \n \n \n \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = sourceData;\n\n readonly gridSettings: GridSettings = {\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n };\n\n enteredName = '';\n selectedCategory = '';\n minPrice = '';\n maxPrice = '';\n\n onNameFilter(event: Event): void {\n this.enteredName = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n onCategoryFilter(event: Event): void {\n this.selectedCategory = (event.target as HTMLSelectElement).value;\n this.applyFilters();\n }\n\n onMinPriceFilter(event: Event): void {\n this.minPrice = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n onMaxPriceFilter(event: Event): void {\n this.maxPrice = (event.target as HTMLInputElement).value.trim();\n this.applyFilters();\n }\n\n clearFilters(): void {\n this.enteredName = '';\n this.selectedCategory = '';\n this.minPrice = '';\n this.maxPrice = '';\n\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n }\n\n private applyFilters(): void {\n const hot = this.hotTable.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n\n if (this.enteredName) {\n filtersPlugin.addCondition(0, 'contains', [this.enteredName]);\n }\n\n if (this.selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [this.selectedCategory]);\n }\n\n if (this.minPrice && this.maxPrice) {\n const lowerBound = Number(this.minPrice);\n const upperBound = Number(this.maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (this.minPrice) {\n const lowerBound = Number(this.minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (this.maxPrice) {\n const upperBound = Number(this.maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/angular/example1.ts","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.js.json index 0decb8188..8dfc9e197 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst sourceData = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1');\n\nrootContainer.innerHTML = `\n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('#hot');\n\nconst hot = new Handsontable(container, {\n data: sourceData,\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst filtersPlugin = hot.getPlugin('filters');\n\nconst categoryFilter = rootContainer.querySelector('#categoryFilter');\nconst nameFilter = rootContainer.querySelector('#nameFilter');\nconst minPriceFilter = rootContainer.querySelector('#minPriceFilter');\nconst maxPriceFilter = rootContainer.querySelector('#maxPriceFilter');\nconst clearFiltersButton = rootContainer.querySelector('#clearFilters');\n\nfunction applyFilters() {\n const selectedCategory = categoryFilter.value;\n const enteredName = nameFilter.value.trim();\n const minPrice = minPriceFilter.value.trim();\n const maxPrice = maxPriceFilter.value.trim();\n\n filtersPlugin.clearConditions();\n\n if (selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [selectedCategory]);\n }\n\n if (enteredName) {\n filtersPlugin.addCondition(0, 'contains', [enteredName]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n}\n\nfunction clearFilters() {\n categoryFilter.value = '';\n nameFilter.value = '';\n minPriceFilter.value = '';\n maxPriceFilter.value = '';\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n}\n\ncategoryFilter.addEventListener('change', applyFilters);\nnameFilter.addEventListener('input', applyFilters);\nminPriceFilter.addEventListener('input', applyFilters);\nmaxPriceFilter.addEventListener('input', applyFilters);\nclearFiltersButton.addEventListener('click', clearFilters);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}\n\n.example-controls-container .filter-label--wide {\n min-width: 160px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/javascript/example1.js","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst sourceData = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1');\n\nrootContainer.innerHTML = `\n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('#hot');\n\nconst hot = new Handsontable(container, {\n data: sourceData,\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst filtersPlugin = hot.getPlugin('filters');\n\nconst categoryFilter = rootContainer.querySelector('#categoryFilter');\nconst nameFilter = rootContainer.querySelector('#nameFilter');\nconst minPriceFilter = rootContainer.querySelector('#minPriceFilter');\nconst maxPriceFilter = rootContainer.querySelector('#maxPriceFilter');\nconst clearFiltersButton = rootContainer.querySelector('#clearFilters');\n\nfunction applyFilters() {\n const selectedCategory = categoryFilter.value;\n const enteredName = nameFilter.value.trim();\n const minPrice = minPriceFilter.value.trim();\n const maxPrice = maxPriceFilter.value.trim();\n\n filtersPlugin.clearConditions();\n\n if (selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [selectedCategory]);\n }\n\n if (enteredName) {\n filtersPlugin.addCondition(0, 'contains', [enteredName]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n}\n\nfunction clearFilters() {\n categoryFilter.value = '';\n nameFilter.value = '';\n minPriceFilter.value = '';\n maxPriceFilter.value = '';\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n}\n\ncategoryFilter.addEventListener('change', applyFilters);\nnameFilter.addEventListener('input', applyFilters);\nminPriceFilter.addEventListener('input', applyFilters);\nmaxPriceFilter.addEventListener('input', applyFilters);\nclearFiltersButton.addEventListener('click', clearFilters);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}\n\n.example-controls-container .filter-label--wide {\n min-width: 160px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/javascript/example1.js","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.ts.json index 2402fc635..54e17b591 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype Product = {\n name: string;\n category: string;\n price: number;\n stock: number;\n};\n\n/* start:skip-in-preview */\nconst sourceData: Product[] = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1')!;\n\nrootContainer.innerHTML = `\n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('#hot')!;\n\nconst hot = new Handsontable(container, {\n data: sourceData,\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst filtersPlugin = hot.getPlugin('filters');\n\nconst categoryFilter = rootContainer.querySelector('#categoryFilter') as HTMLSelectElement;\nconst nameFilter = rootContainer.querySelector('#nameFilter') as HTMLInputElement;\nconst minPriceFilter = rootContainer.querySelector('#minPriceFilter') as HTMLInputElement;\nconst maxPriceFilter = rootContainer.querySelector('#maxPriceFilter') as HTMLInputElement;\nconst clearFiltersButton = rootContainer.querySelector('#clearFilters') as HTMLButtonElement;\n\nfunction applyFilters(): void {\n const selectedCategory = categoryFilter.value;\n const enteredName = nameFilter.value.trim();\n const minPrice = minPriceFilter.value.trim();\n const maxPrice = maxPriceFilter.value.trim();\n\n filtersPlugin.clearConditions();\n\n if (selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [selectedCategory]);\n }\n\n if (enteredName) {\n filtersPlugin.addCondition(0, 'contains', [enteredName]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n}\n\nfunction clearFilters(): void {\n categoryFilter.value = '';\n nameFilter.value = '';\n minPriceFilter.value = '';\n maxPriceFilter.value = '';\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n}\n\ncategoryFilter.addEventListener('change', applyFilters);\nnameFilter.addEventListener('input', applyFilters);\nminPriceFilter.addEventListener('input', applyFilters);\nmaxPriceFilter.addEventListener('input', applyFilters);\nclearFiltersButton.addEventListener('click', clearFilters);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}\n\n.example-controls-container .filter-label--wide {\n min-width: 160px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/javascript/example1.ts","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\ntype Product = {\n name: string;\n category: string;\n price: number;\n stock: number;\n};\n\n/* start:skip-in-preview */\nconst sourceData: Product[] = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\nconst rootContainer = document.querySelector('#example1')!;\n\nrootContainer.innerHTML = `\n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n`;\n\nconst container = rootContainer.querySelector('#hot')!;\n\nconst hot = new Handsontable(container, {\n data: sourceData,\n columns: [\n { data: 'name', type: 'text', title: 'Product' },\n { data: 'category', type: 'text', title: 'Category' },\n { data: 'price', type: 'numeric', title: 'Price' },\n { data: 'stock', type: 'numeric', title: 'Stock' },\n ],\n colHeaders: ['Product', 'Category', 'Price', 'Stock'],\n rowHeaders: true,\n filters: true,\n dropdownMenu: false,\n width: '100%',\n height: 320,\n autoWrapRow: true,\n autoWrapCol: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\nconst filtersPlugin = hot.getPlugin('filters');\n\nconst categoryFilter = rootContainer.querySelector('#categoryFilter') as HTMLSelectElement;\nconst nameFilter = rootContainer.querySelector('#nameFilter') as HTMLInputElement;\nconst minPriceFilter = rootContainer.querySelector('#minPriceFilter') as HTMLInputElement;\nconst maxPriceFilter = rootContainer.querySelector('#maxPriceFilter') as HTMLInputElement;\nconst clearFiltersButton = rootContainer.querySelector('#clearFilters') as HTMLButtonElement;\n\nfunction applyFilters(): void {\n const selectedCategory = categoryFilter.value;\n const enteredName = nameFilter.value.trim();\n const minPrice = minPriceFilter.value.trim();\n const maxPrice = maxPriceFilter.value.trim();\n\n filtersPlugin.clearConditions();\n\n if (selectedCategory) {\n filtersPlugin.addCondition(1, 'eq', [selectedCategory]);\n }\n\n if (enteredName) {\n filtersPlugin.addCondition(0, 'contains', [enteredName]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n hot.render();\n}\n\nfunction clearFilters(): void {\n categoryFilter.value = '';\n nameFilter.value = '';\n minPriceFilter.value = '';\n maxPriceFilter.value = '';\n\n filtersPlugin.clearConditions();\n filtersPlugin.filter();\n hot.render();\n}\n\ncategoryFilter.addEventListener('change', applyFilters);\nnameFilter.addEventListener('input', applyFilters);\nminPriceFilter.addEventListener('input', applyFilters);\nmaxPriceFilter.addEventListener('input', applyFilters);\nclearFiltersButton.addEventListener('click', clearFilters);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}\n\n.example-controls-container .filter-label--wide {\n min-width: 160px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/javascript/example1.ts","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__react__example1.tsx.json index 7cd7fb4d8..182fba29b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__filtering-search__multi-column-filter-panel__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, type ReactNode } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst sourceData = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\ntype FilterLabelProps = {\n label: string;\n children: ReactNode;\n};\n\nconst FilterLabel = ({ label, children }: FilterLabelProps) => (\n \n);\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const nameRef = useRef(null);\n const categoryRef = useRef(null);\n const minPriceRef = useRef(null);\n const maxPriceRef = useRef(null);\n\n const applyFilters = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const name = nameRef.current?.value ?? '';\n const category = categoryRef.current?.value ?? '';\n const minPrice = minPriceRef.current?.value ?? '';\n const maxPrice = maxPriceRef.current?.value ?? '';\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n\n if (category) {\n filtersPlugin.addCondition(1, 'eq', [category]);\n }\n\n if (name.trim()) {\n filtersPlugin.addCondition(0, 'contains', [name.trim()]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n };\n\n const clearFilters = () => {\n if (nameRef.current) nameRef.current.value = '';\n if (categoryRef.current) categoryRef.current.value = '';\n if (minPriceRef.current) minPriceRef.current.value = '';\n if (maxPriceRef.current) maxPriceRef.current.value = '';\n\n applyFilters();\n };\n\n return (\n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/react/example1.tsx","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Filtering Search ▸ Multi-column filter panel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, type ReactNode } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst sourceData = [\n { name: 'Trail Bike', category: 'Bikes', price: 1499, stock: 12 },\n { name: 'Road Helmet', category: 'Safety', price: 89, stock: 42 },\n { name: 'Flat Pedals', category: 'Components', price: 59, stock: 80 },\n { name: 'Hydration Pack', category: 'Accessories', price: 129, stock: 23 },\n { name: 'Brake Pads', category: 'Components', price: 25, stock: 150 },\n { name: 'Cycling Glasses', category: 'Accessories', price: 79, stock: 33 },\n { name: 'Chain Lube', category: 'Maintenance', price: 16, stock: 99 },\n { name: 'Torque Wrench', category: 'Maintenance', price: 139, stock: 14 },\n { name: 'Kids Helmet', category: 'Safety', price: 54, stock: 20 },\n { name: 'Gravel Bike', category: 'Bikes', price: 2199, stock: 7 },\n];\n/* end:skip-in-preview */\n\ntype FilterLabelProps = {\n label: string;\n children: ReactNode;\n};\n\nconst FilterLabel = ({ label, children }: FilterLabelProps) => (\n \n);\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const nameRef = useRef(null);\n const categoryRef = useRef(null);\n const minPriceRef = useRef(null);\n const maxPriceRef = useRef(null);\n\n const applyFilters = () => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const name = nameRef.current?.value ?? '';\n const category = categoryRef.current?.value ?? '';\n const minPrice = minPriceRef.current?.value ?? '';\n const maxPrice = maxPriceRef.current?.value ?? '';\n const filtersPlugin = hot.getPlugin('filters');\n\n filtersPlugin.clearConditions();\n\n if (category) {\n filtersPlugin.addCondition(1, 'eq', [category]);\n }\n\n if (name.trim()) {\n filtersPlugin.addCondition(0, 'contains', [name.trim()]);\n }\n\n if (minPrice && maxPrice) {\n const lowerBound = Number(minPrice);\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(lowerBound) && Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'between', [lowerBound, upperBound]);\n }\n } else if (minPrice) {\n const lowerBound = Number(minPrice);\n\n if (Number.isFinite(lowerBound)) {\n filtersPlugin.addCondition(2, 'gte', [lowerBound]);\n }\n } else if (maxPrice) {\n const upperBound = Number(maxPrice);\n\n if (Number.isFinite(upperBound)) {\n filtersPlugin.addCondition(2, 'lte', [upperBound]);\n }\n }\n\n filtersPlugin.filter();\n };\n\n const clearFilters = () => {\n if (nameRef.current) nameRef.current.value = '';\n if (categoryRef.current) categoryRef.current.value = '';\n if (minPriceRef.current) minPriceRef.current.value = '';\n if (maxPriceRef.current) maxPriceRef.current.value = '';\n\n applyFilters();\n };\n\n return (\n
    \n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".filter-panel {\n display: flex;\n gap: 0.75rem;\n flex-wrap: wrap;\n align-items: flex-end;\n}\n\n/* Stack label text above the control (overrides the inline-flex horizontal\n layout from interactive-example.css) */\n.example-controls-container .filter-label {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 0.25rem;\n min-width: 120px;\n}"},"docsPath":"recipes/filtering-search/multi-column-filter-panel/react/example1.tsx","breadcrumb":["Recipes","Filtering Search","Multi-column filter panel"],"guide":"recipes/filtering-search/multi-column-filter-panel/multi-column-filter-panel.md","guideTitle":"Multi-column filter panel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/filtering-search/multi-column-filter-panel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__angular__example1.ts.json index ecd14a1aa..fac36743d 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { jsPDF } from 'jspdf';\nimport { autoTable } from 'jspdf-autotable';\n\n/* start:skip-in-preview */\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-export-to-pdf',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Qty', 'Unit price', 'Line total'],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n };\n\n exportToPdf(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const body: any = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: 'linebreak' },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: 'bold',\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: 'everyPage',\n });\n\n doc.save('export.pdf');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/import-export/export-to-pdf/angular/example1.ts","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { jsPDF } from 'jspdf';\nimport { autoTable } from 'jspdf-autotable';\n\n/* start:skip-in-preview */\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-export-to-pdf',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Product', 'Qty', 'Unit price', 'Line total'],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n };\n\n exportToPdf(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const body: any = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: 'linebreak' },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: 'bold',\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: 'everyPage',\n });\n\n doc.save('export.pdf');\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/import-export/export-to-pdf/angular/example1.ts","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.js.json index 95ab3de6d..9fbf3a757 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { jsPDF } from \"jspdf\";\nimport { autoTable } from \"jspdf-autotable\";\nregisterAllModules();\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"SKU\", \"Product\", \"Qty\", \"Unit price\", \"Line total\"],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n});\nfunction exportGridToPdf() {\n const body = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n const doc = new jsPDF({ orientation: \"portrait\", unit: \"mm\", format: \"a4\" });\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: \"linebreak\" },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: \"bold\",\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: \"everyPage\",\n });\n doc.save(\"export.pdf\");\n}\ndocument.querySelector(\"#exportPdfBtn\").addEventListener(\"click\", exportGridToPdf);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/import-export/export-to-pdf/javascript/example1.js","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { jsPDF } from \"jspdf\";\nimport { autoTable } from \"jspdf-autotable\";\nregisterAllModules();\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"SKU\", \"Product\", \"Qty\", \"Unit price\", \"Line total\"],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n});\nfunction exportGridToPdf() {\n const body = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n const doc = new jsPDF({ orientation: \"portrait\", unit: \"mm\", format: \"a4\" });\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: \"linebreak\" },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: \"bold\",\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: \"everyPage\",\n });\n doc.save(\"export.pdf\");\n}\ndocument.querySelector(\"#exportPdfBtn\").addEventListener(\"click\", exportGridToPdf);","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/import-export/export-to-pdf/javascript/example1.js","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.ts.json index 964ed0b3d..83d0f8705 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { jsPDF } from \"jspdf\";\nimport { autoTable } from \"jspdf-autotable\";\n\nregisterAllModules();\n\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"SKU\", \"Product\", \"Qty\", \"Unit price\", \"Line total\"],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n});\n\nfunction exportGridToPdf() {\n const body = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: \"portrait\", unit: \"mm\", format: \"a4\" });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: \"linebreak\" },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: \"bold\",\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: \"everyPage\",\n });\n\n doc.save(\"export.pdf\");\n}\n\ndocument.querySelector(\"#exportPdfBtn\")!.addEventListener(\"click\", exportGridToPdf);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/import-export/export-to-pdf/javascript/example1.ts","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport { jsPDF } from \"jspdf\";\nimport { autoTable } from \"jspdf-autotable\";\n\nregisterAllModules();\n\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: [\"SKU\", \"Product\", \"Qty\", \"Unit price\", \"Line total\"],\n columnSorting: true,\n rowHeaders: true,\n height: 320,\n width: \"100%\",\n licenseKey: \"non-commercial-and-evaluation\",\n});\n\nfunction exportGridToPdf() {\n const body = hot.getData();\n const colCount = hot.countCols();\n const head = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: \"portrait\", unit: \"mm\", format: \"a4\" });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: \"linebreak\" },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: \"bold\",\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: \"everyPage\",\n });\n\n doc.save(\"export.pdf\");\n}\n\ndocument.querySelector(\"#exportPdfBtn\")!.addEventListener(\"click\", exportGridToPdf);","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/import-export/export-to-pdf/javascript/example1.ts","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__react__example1.tsx.json index 9eece19a9..f57cb6103 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__export-to-pdf__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { jsPDF } from 'jspdf';\nimport { autoTable } from 'jspdf-autotable';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data: (string | number)[][] = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const exportGridToPdf = (): void => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const body = hot.getData() as (string | number)[][];\n const colCount = hot.countCols();\n const head: string[][] = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: 'linebreak' },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: 'bold',\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: 'everyPage',\n });\n\n doc.save('export.pdf');\n };\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/import-export/export-to-pdf/react/example1.tsx","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Import Export ▸ Export to PDF · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"jspdf\": \"4.2.1\",\n \"jspdf-autotable\": \"5.0.9\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { jsPDF } from 'jspdf';\nimport { autoTable } from 'jspdf-autotable';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\n// Enough rows to span multiple A4 pages when exported (jspdf-autotable paginates automatically).\nconst ROWS = 85;\nconst data: (string | number)[][] = Array.from({ length: ROWS }, (_, row) => [\n `SKU-${1000 + row}`,\n `Product ${row + 1}`,\n row % 12 + 1,\n (9.99 + row * 0.25).toFixed(2),\n ((row % 12 + 1) * (9.99 + row * 0.25)).toFixed(2),\n]);\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const exportGridToPdf = (): void => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const body = hot.getData() as (string | number)[][];\n const colCount = hot.countCols();\n const head: string[][] = [\n Array.from({ length: colCount }, (_, col) => String(hot.getColHeader(col))),\n ];\n\n const doc = new jsPDF({ orientation: 'portrait', unit: 'mm', format: 'a4' });\n\n autoTable(doc, {\n head,\n body,\n styles: { fontSize: 8, cellPadding: 1.5, overflow: 'linebreak' },\n headStyles: {\n fillColor: [26, 66, 232],\n textColor: 255,\n fontStyle: 'bold',\n },\n alternateRowStyles: { fillColor: [245, 247, 250] },\n margin: { top: 14, left: 12, right: 12, bottom: 14 },\n showHead: 'everyPage',\n });\n\n doc.save('export.pdf');\n };\n\n return (\n <>\n
    \n
    \n \n
    \n
    \n \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/import-export/export-to-pdf/react/example1.tsx","breadcrumb":["Recipes","Import Export","Export to PDF"],"guide":"recipes/import-export/export-to-pdf/export-to-pdf.md","guideTitle":"Export to PDF","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/export-to-pdf","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__angular__example1.ts.json index 9068fcd94..7728b1fdb 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"papaparse\": \"5.7.0\"\n },\n \"devDependencies\": {\n \"@types/papaparse\": \"5.5.2\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport Papa from 'papaparse';\n\ninterface ParsedPayload {\n headers: string[];\n rows: Record[];\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction normalizeCellValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n const text = String(value).trim();\n return text === '' ? null : text;\n}\n\nfunction processPapaResults(results: Papa.ParseResult>): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n const fields = (results.meta.fields ?? []).filter((f) => f !== undefined && f !== '');\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n const rows = results.data.map((row) => {\n const out: Record = {};\n for (const key of fields) {\n out[key] = normalizeCellValue(row[key]);\n }\n return out;\n });\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text: string): ParsedPayload {\n const trimmed = text.trim();\n if (!trimmed) {\n throw new Error('The input is empty.');\n }\n const parsed = Papa.parse>(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file: File): Promise {\n return new Promise((resolve, reject) => {\n Papa.parse>(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n complete: (results: Papa.ParseResult>) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err: Error) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: Record[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: Record = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n if (ext === 'csv') {\n return parseCsvFile(file);\n }\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-import-csv-excel',\n template: `\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n\n @if (errorMessage) {\n
    {{ errorMessage }}
    \n }\n\n @if (gridData.length === 0) {\n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    \n Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.\n

    \n
    \n } @else {\n \n }\n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n isDragOver = false;\n errorMessage = '';\n gridData: Record[] = [];\n\n private readonly SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\n gridSettings: GridSettings = {\n colHeaders: [],\n columns: [],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n };\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(): void {\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n this.handleFile(file);\n }\n }\n\n onFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n this.handleFile(file);\n }\n input.value = '';\n }\n\n async loadSampleData(): Promise {\n this.errorMessage = '';\n try {\n const payload = parseCsvText(this.SAMPLE_CSV);\n this.loadIntoGrid(payload);\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n }\n }\n\n private async handleFile(file: File): Promise {\n this.errorMessage = '';\n if (file.size === 0) {\n this.errorMessage = 'The file is empty.';\n return;\n }\n try {\n const payload = await parseFile(file);\n this.loadIntoGrid(payload);\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private loadIntoGrid(payload: ParsedPayload): void {\n const { headers, rows } = payload;\n this.gridSettings = {\n ...this.gridSettings,\n colHeaders: headers,\n columns: this.columnsFromHeaders(headers, rows),\n };\n this.gridData = [...rows];\n }\n\n private columnsFromHeaders(headers: string[], rows: Record[]): GridSettings['columns'] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v) => v !== null);\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' };\n }\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' };\n }\n return { data, type: 'text' };\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n cursor: pointer;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/angular/example1.ts","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"papaparse\": \"5.7.0\"\n },\n \"devDependencies\": {\n \"@types/papaparse\": \"5.5.2\"\n }\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport Papa from 'papaparse';\n\ninterface ParsedPayload {\n headers: string[];\n rows: Record[];\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction normalizeCellValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n const text = String(value).trim();\n return text === '' ? null : text;\n}\n\nfunction processPapaResults(results: Papa.ParseResult>): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n const fields = (results.meta.fields ?? []).filter((f) => f !== undefined && f !== '');\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n const rows = results.data.map((row) => {\n const out: Record = {};\n for (const key of fields) {\n out[key] = normalizeCellValue(row[key]);\n }\n return out;\n });\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text: string): ParsedPayload {\n const trimmed = text.trim();\n if (!trimmed) {\n throw new Error('The input is empty.');\n }\n const parsed = Papa.parse>(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file: File): Promise {\n return new Promise((resolve, reject) => {\n Papa.parse>(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n complete: (results: Papa.ParseResult>) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err: Error) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: Record[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: Record = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n if (ext === 'csv') {\n return parseCsvFile(file);\n }\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-import-csv-excel',\n template: `\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n\n @if (errorMessage) {\n
    {{ errorMessage }}
    \n }\n\n @if (gridData.length === 0) {\n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    \n Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.\n

    \n
    \n } @else {\n \n }\n
    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n isDragOver = false;\n errorMessage = '';\n gridData: Record[] = [];\n\n private readonly SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\n gridSettings: GridSettings = {\n colHeaders: [],\n columns: [],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n };\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(): void {\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n const file = event.dataTransfer?.files?.[0];\n if (file) {\n this.handleFile(file);\n }\n }\n\n onFileChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) {\n this.handleFile(file);\n }\n input.value = '';\n }\n\n async loadSampleData(): Promise {\n this.errorMessage = '';\n try {\n const payload = parseCsvText(this.SAMPLE_CSV);\n this.loadIntoGrid(payload);\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n }\n }\n\n private async handleFile(file: File): Promise {\n this.errorMessage = '';\n if (file.size === 0) {\n this.errorMessage = 'The file is empty.';\n return;\n }\n try {\n const payload = await parseFile(file);\n this.loadIntoGrid(payload);\n } catch (e) {\n this.errorMessage = e instanceof Error ? e.message : String(e);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private loadIntoGrid(payload: ParsedPayload): void {\n const { headers, rows } = payload;\n this.gridSettings = {\n ...this.gridSettings,\n colHeaders: headers,\n columns: this.columnsFromHeaders(headers, rows),\n };\n this.gridData = [...rows];\n }\n\n private columnsFromHeaders(headers: string[], rows: Record[]): GridSettings['columns'] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v) => v !== null);\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' };\n }\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' };\n }\n return { data, type: 'text' };\n });\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n cursor: pointer;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/angular/example1.ts","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.js.json index 22e441564..b69905e9f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n \n \n \n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.

    \n
    \n \n \n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\nconst scriptPromises = new Map();\n\nfunction loadScript(src) {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`);\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`Failed to load ${src}`)), { once: true });\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\nasync function ensurePapa() {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name) {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction showError(el, message) {\n if (!el) {\n return;\n }\n\n el.textContent = message;\n el.hidden = false;\n}\n\nfunction clearError(el) {\n if (!el) {\n return;\n }\n\n el.textContent = '';\n el.hidden = true;\n}\n\nfunction normalizeCellValue(value) {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row, headers) {\n const out = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\nfunction processPapaResults(results) {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = results.data.map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text, PapaRef) {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file, PapaRef) {\n return new Promise((resolve, reject) => {\n PapaRef.parse(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n complete: (results) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file) {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = Array.isArray(result.colHeaders) ? result.colHeaders : [];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows = [];\n\n for (const line of result.data) {\n const obj = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file) {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\nfunction columnsFromHeaders(headers, rows) {\n return headers.map((data) => {\n const values = rows.map((row) => row[data]).filter((v) => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' };\n }\n\n return { data, type: 'text' };\n });\n}\n\nconst gridContainer = document.querySelector('#example1');\nconst emptyEl = document.querySelector('#import-empty');\nconst errEl = document.querySelector('#import-error');\nconst fileInput = document.querySelector('#import-file');\nconst dropzone = document.querySelector('#import-dropzone');\nconst sampleBtn = document.querySelector('#import-load-sample');\n\nlet hot = null;\n\nfunction loadIntoGrid({ headers, rows }) {\n const columns = columnsFromHeaders(headers, rows);\n\n if (!hot) {\n if (emptyEl) {\n emptyEl.hidden = true;\n }\n gridContainer.hidden = false;\n hot = new Handsontable(gridContainer, {\n data: rows,\n columns,\n colHeaders: headers,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n licenseKey: 'non-commercial-and-evaluation',\n });\n } else {\n hot.updateSettings({ colHeaders: headers, columns });\n hot.loadData(rows);\n }\n}\n\nasync function handleFile(file) {\n clearError(errEl);\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n showError(errEl, 'The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n}\n\nfileInput?.addEventListener('change', () => {\n const f = fileInput.files?.[0];\n\n handleFile(f);\n fileInput.value = '';\n});\n\ndropzone?.addEventListener('dragover', (ev) => {\n ev.preventDefault();\n dropzone.classList.add('import-dropzone--active');\n});\n\ndropzone?.addEventListener('dragleave', () => {\n dropzone.classList.remove('import-dropzone--active');\n});\n\ndropzone?.addEventListener('drop', (ev) => {\n ev.preventDefault();\n dropzone.classList.remove('import-dropzone--active');\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n});\n\nsampleBtn?.addEventListener('click', async () => {\n clearError(errEl);\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty[hidden] {\n display: none;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}\n\n#example1 {\n padding: 1rem;\n min-height: 180px;\n}\n\n#example1[hidden] {\n display: none;\n}"},"docsPath":"recipes/import-export/import-csv-excel/javascript/example1.js","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n \n \n \n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.

    \n
    \n \n \n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\nconst scriptPromises = new Map();\n\nfunction loadScript(src) {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`);\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`Failed to load ${src}`)), { once: true });\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\nasync function ensurePapa() {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name) {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction showError(el, message) {\n if (!el) {\n return;\n }\n\n el.textContent = message;\n el.hidden = false;\n}\n\nfunction clearError(el) {\n if (!el) {\n return;\n }\n\n el.textContent = '';\n el.hidden = true;\n}\n\nfunction normalizeCellValue(value) {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row, headers) {\n const out = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\nfunction processPapaResults(results) {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = results.data.map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text, PapaRef) {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file, PapaRef) {\n return new Promise((resolve, reject) => {\n PapaRef.parse(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n complete: (results) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file) {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = Array.isArray(result.colHeaders) ? result.colHeaders : [];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows = [];\n\n for (const line of result.data) {\n const obj = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file) {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\nfunction columnsFromHeaders(headers, rows) {\n return headers.map((data) => {\n const values = rows.map((row) => row[data]).filter((v) => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' };\n }\n\n return { data, type: 'text' };\n });\n}\n\nconst gridContainer = document.querySelector('#example1');\nconst emptyEl = document.querySelector('#import-empty');\nconst errEl = document.querySelector('#import-error');\nconst fileInput = document.querySelector('#import-file');\nconst dropzone = document.querySelector('#import-dropzone');\nconst sampleBtn = document.querySelector('#import-load-sample');\n\nlet hot = null;\n\nfunction loadIntoGrid({ headers, rows }) {\n const columns = columnsFromHeaders(headers, rows);\n\n if (!hot) {\n if (emptyEl) {\n emptyEl.hidden = true;\n }\n gridContainer.hidden = false;\n hot = new Handsontable(gridContainer, {\n data: rows,\n columns,\n colHeaders: headers,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n licenseKey: 'non-commercial-and-evaluation',\n });\n } else {\n hot.updateSettings({ colHeaders: headers, columns });\n hot.loadData(rows);\n }\n}\n\nasync function handleFile(file) {\n clearError(errEl);\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n showError(errEl, 'The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n}\n\nfileInput?.addEventListener('change', () => {\n const f = fileInput.files?.[0];\n\n handleFile(f);\n fileInput.value = '';\n});\n\ndropzone?.addEventListener('dragover', (ev) => {\n ev.preventDefault();\n dropzone.classList.add('import-dropzone--active');\n});\n\ndropzone?.addEventListener('dragleave', () => {\n dropzone.classList.remove('import-dropzone--active');\n});\n\ndropzone?.addEventListener('drop', (ev) => {\n ev.preventDefault();\n dropzone.classList.remove('import-dropzone--active');\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n});\n\nsampleBtn?.addEventListener('click', async () => {\n clearError(errEl);\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty[hidden] {\n display: none;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}\n\n#example1 {\n padding: 1rem;\n min-height: 180px;\n}\n\n#example1[hidden] {\n display: none;\n}"},"docsPath":"recipes/import-export/import-csv-excel/javascript/example1.js","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.ts.json index 276ec77cf..de0297036 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"papaparse\": \"5.7.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n \n \n \n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.

    \n
    \n \n \n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { GridSettings } from 'handsontable/settings';\nimport Papa from 'papaparse';\n\nregisterAllModules();\n\ntype ParsedPayload = {\n headers: string[];\n rows: Record[];\n};\n\ntype ParsedCellValue = string | number | boolean | null;\ntype ParsedRow = Record;\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\ndeclare global {\n interface Window {\n Papa?: typeof Papa;\n }\n}\n\nconst scriptPromises = new Map>();\n\nfunction loadScript(src: string): Promise {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`);\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener(\n 'error',\n () => reject(new Error(`Failed to load ${src}`)),\n { once: true },\n );\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\nasync function ensurePapa(): Promise {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction showError(el: HTMLElement | null, message: string): void {\n if (!el) {\n return;\n }\n\n el.textContent = message;\n el.hidden = false;\n}\n\nfunction clearError(el: HTMLElement | null): void {\n if (!el) {\n return;\n }\n\n el.textContent = '';\n el.hidden = true;\n}\n\nfunction normalizeCellValue(value: unknown): ParsedCellValue {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row: Record, headers: string[]): ParsedRow {\n const out: ParsedRow = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\nfunction processPapaResults(results: Papa.ParseResult>): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = (results.data as Record[]).map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text: string, PapaRef: typeof Papa): ParsedPayload {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse>(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file: File, PapaRef: typeof Papa): Promise {\n return new Promise((resolve, reject) => {\n PapaRef.parse>(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n complete: (results) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: ParsedRow[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: ParsedRow = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\nfunction columnsFromHeaders(headers: string[], rows: ParsedRow[]): GridSettings['columns'] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v): v is string | number | boolean => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' as const };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' as const };\n }\n\n return { data, type: 'text' as const };\n });\n}\n\nconst gridContainer = document.querySelector('#example1')!;\nconst emptyEl = document.querySelector('#import-empty');\nconst errEl = document.querySelector('#import-error');\nconst fileInput = document.querySelector('#import-file');\nconst dropzone = document.querySelector('#import-dropzone');\nconst sampleBtn = document.querySelector('#import-load-sample');\n\nlet hot: Handsontable | null = null;\n\nfunction loadIntoGrid({ headers, rows }: ParsedPayload): void {\n const columns = columnsFromHeaders(headers, rows);\n\n if (!hot) {\n if (emptyEl) {\n emptyEl.hidden = true;\n }\n gridContainer.hidden = false;\n hot = new Handsontable(gridContainer, {\n data: rows,\n columns,\n colHeaders: headers,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n licenseKey: 'non-commercial-and-evaluation',\n });\n } else {\n hot.updateSettings({ colHeaders: headers, columns });\n hot.loadData(rows);\n }\n}\n\nasync function handleFile(file: File | null | undefined): Promise {\n clearError(errEl);\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n showError(errEl, 'The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n}\n\nfileInput?.addEventListener('change', () => {\n const f = fileInput.files?.[0];\n\n handleFile(f);\n fileInput.value = '';\n});\n\ndropzone?.addEventListener('dragover', (ev) => {\n ev.preventDefault();\n dropzone.classList.add('import-dropzone--active');\n});\n\ndropzone?.addEventListener('dragleave', () => {\n dropzone.classList.remove('import-dropzone--active');\n});\n\ndropzone?.addEventListener('drop', (ev) => {\n ev.preventDefault();\n dropzone.classList.remove('import-dropzone--active');\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n});\n\nsampleBtn?.addEventListener('click', async () => {\n clearError(errEl);\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty[hidden] {\n display: none;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}\n\n#example1 {\n padding: 1rem;\n min-height: 180px;\n}\n\n#example1[hidden] {\n display: none;\n}"},"docsPath":"recipes/import-export/import-csv-excel/javascript/example1.ts","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"papaparse\": \"5.7.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n

    Drop a .csv or .xlsx file here, or pick a source.

    \n
    \n \n \n
    \n
    \n \n \n \n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.

    \n
    \n \n \n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { GridSettings } from 'handsontable/settings';\nimport Papa from 'papaparse';\n\nregisterAllModules();\n\ntype ParsedPayload = {\n headers: string[];\n rows: Record[];\n};\n\ntype ParsedCellValue = string | number | boolean | null;\ntype ParsedRow = Record;\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\ndeclare global {\n interface Window {\n Papa?: typeof Papa;\n }\n}\n\nconst scriptPromises = new Map>();\n\nfunction loadScript(src: string): Promise {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`);\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener(\n 'error',\n () => reject(new Error(`Failed to load ${src}`)),\n { once: true },\n );\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\nasync function ensurePapa(): Promise {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\nfunction showError(el: HTMLElement | null, message: string): void {\n if (!el) {\n return;\n }\n\n el.textContent = message;\n el.hidden = false;\n}\n\nfunction clearError(el: HTMLElement | null): void {\n if (!el) {\n return;\n }\n\n el.textContent = '';\n el.hidden = true;\n}\n\nfunction normalizeCellValue(value: unknown): ParsedCellValue {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row: Record, headers: string[]): ParsedRow {\n const out: ParsedRow = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\nfunction processPapaResults(results: Papa.ParseResult>): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = (results.data as Record[]).map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\nfunction parseCsvText(text: string, PapaRef: typeof Papa): ParsedPayload {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse>(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n });\n\n return processPapaResults(parsed);\n}\n\nasync function parseCsvFile(file: File, PapaRef: typeof Papa): Promise {\n return new Promise((resolve, reject) => {\n PapaRef.parse>(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h) => h.trim(),\n complete: (results) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: ParsedRow[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: ParsedRow = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n\nfunction columnsFromHeaders(headers: string[], rows: ParsedRow[]): GridSettings['columns'] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v): v is string | number | boolean => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' as const };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' as const };\n }\n\n return { data, type: 'text' as const };\n });\n}\n\nconst gridContainer = document.querySelector('#example1')!;\nconst emptyEl = document.querySelector('#import-empty');\nconst errEl = document.querySelector('#import-error');\nconst fileInput = document.querySelector('#import-file');\nconst dropzone = document.querySelector('#import-dropzone');\nconst sampleBtn = document.querySelector('#import-load-sample');\n\nlet hot: Handsontable | null = null;\n\nfunction loadIntoGrid({ headers, rows }: ParsedPayload): void {\n const columns = columnsFromHeaders(headers, rows);\n\n if (!hot) {\n if (emptyEl) {\n emptyEl.hidden = true;\n }\n gridContainer.hidden = false;\n hot = new Handsontable(gridContainer, {\n data: rows,\n columns,\n colHeaders: headers,\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n licenseKey: 'non-commercial-and-evaluation',\n });\n } else {\n hot.updateSettings({ colHeaders: headers, columns });\n hot.loadData(rows);\n }\n}\n\nasync function handleFile(file: File | null | undefined): Promise {\n clearError(errEl);\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n showError(errEl, 'The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n}\n\nfileInput?.addEventListener('change', () => {\n const f = fileInput.files?.[0];\n\n handleFile(f);\n fileInput.value = '';\n});\n\ndropzone?.addEventListener('dragover', (ev) => {\n ev.preventDefault();\n dropzone.classList.add('import-dropzone--active');\n});\n\ndropzone?.addEventListener('dragleave', () => {\n dropzone.classList.remove('import-dropzone--active');\n});\n\ndropzone?.addEventListener('drop', (ev) => {\n ev.preventDefault();\n dropzone.classList.remove('import-dropzone--active');\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n});\n\nsampleBtn?.addEventListener('click', async () => {\n clearError(errEl);\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n showError(errEl, e instanceof Error ? e.message : String(e));\n }\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty[hidden] {\n display: none;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}\n\n#example1 {\n padding: 1rem;\n min-height: 180px;\n}\n\n#example1[hidden] {\n display: none;\n}"},"docsPath":"recipes/import-export/import-csv-excel/javascript/example1.ts","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__react__example1.tsx.json index a6cb9cb3c..b11fbb3da 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Papa?: any;\n }\n}\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\nconst scriptPromises = new Map>();\n\nfunction loadScript(src: string): Promise {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`) as HTMLScriptElement | null;\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`Failed to load ${src}`)), { once: true });\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function ensurePapa(): Promise {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\ntype CellValue = string | number | boolean | null;\n\ntype ParsedPayload = {\n headers: string[];\n rows: Record[];\n};\n\ntype ColumnDef = {\n data: string;\n type: 'text' | 'numeric' | 'checkbox';\n};\n\nfunction normalizeCellValue(value: unknown): CellValue {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row: Record, headers: string[]): Record {\n const out: Record = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\ntype PapaParseResults = {\n data: Record[];\n errors: { message?: string }[];\n meta: { fields?: string[] };\n};\n\nfunction processPapaResults(results: PapaParseResults): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = results.data.map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseCsvText(text: string, PapaRef: any): ParsedPayload {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n }) as PapaParseResults;\n\n return processPapaResults(parsed);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function parseCsvFile(file: File, PapaRef: any): Promise {\n return new Promise((resolve, reject) => {\n PapaRef.parse(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n complete: (results: PapaParseResults) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err: unknown) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: Record[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: Record = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nfunction columnsFromHeaders(headers: string[], rows: Record[]): ColumnDef[] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v) => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' as const };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' as const };\n }\n\n return { data, type: 'text' as const };\n });\n}\n\n/* start:skip-in-preview */\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const [errorMessage, setErrorMessage] = useState('');\n const [dropzoneActive, setDropzoneActive] = useState(false);\n const [gridData, setGridData] = useState[]>([]);\n const [gridColHeaders, setGridColHeaders] = useState([]);\n const [gridColumns, setGridColumns] = useState([]);\n\n const loadIntoGrid = ({ headers, rows }: ParsedPayload): void => {\n setErrorMessage('');\n setGridColHeaders(headers);\n setGridColumns(columnsFromHeaders(headers, rows));\n setGridData(rows);\n };\n\n const handleError = (e: unknown): void => {\n setErrorMessage(e instanceof Error ? e.message : String(e));\n };\n\n const handleFile = async (file: File | undefined): Promise => {\n setErrorMessage('');\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n setErrorMessage('The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n handleError(e);\n }\n };\n\n const handleFileInputChange = (ev: React.ChangeEvent): void => {\n const f = ev.target.files?.[0];\n\n handleFile(f);\n ev.target.value = '';\n };\n\n const handleDragOver = (ev: React.DragEvent): void => {\n ev.preventDefault();\n setDropzoneActive(true);\n };\n\n const handleDragLeave = (): void => {\n setDropzoneActive(false);\n };\n\n const handleDrop = (ev: React.DragEvent): void => {\n ev.preventDefault();\n setDropzoneActive(false);\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n };\n\n const handleLoadSample = async (): Promise => {\n setErrorMessage('');\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n handleError(e);\n }\n };\n\n return (\n
    \n \n

    \n Drop a .csv or .xlsx file here, or pick a source.\n

    \n
    \n \n \n
    \n
    \n\n {errorMessage && (\n
    {errorMessage}
    \n )}\n\n {gridData.length === 0 ? (\n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    \n Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.\n

    \n
    \n ) : (\n \n )}\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/react/example1.tsx","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useState } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport './example1.css';\n\nregisterAllModules();\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Papa?: any;\n }\n}\n\nconst CDN_PAPAPARSE = 'https://cdn.jsdelivr.net/npm/papaparse@5.5.3/papaparse.min.js';\n\nconst scriptPromises = new Map>();\n\nfunction loadScript(src: string): Promise {\n const cached = scriptPromises.get(src);\n\n if (cached) {\n return cached;\n }\n\n const p = new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[data-cdn=\"${src}\"]`) as HTMLScriptElement | null;\n\n if (existing) {\n existing.addEventListener('load', () => resolve(), { once: true });\n existing.addEventListener('error', () => reject(new Error(`Failed to load ${src}`)), { once: true });\n if (existing.getAttribute('data-loaded') === '1') {\n resolve();\n }\n\n return;\n }\n\n const s = document.createElement('script');\n\n s.src = src;\n s.async = true;\n s.dataset.cdn = src;\n s.onload = () => {\n s.setAttribute('data-loaded', '1');\n resolve();\n };\n s.onerror = () => reject(new Error(`Failed to load ${src}`));\n document.head.appendChild(s);\n });\n\n scriptPromises.set(src, p);\n\n return p;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function ensurePapa(): Promise {\n if (typeof window.Papa !== 'undefined') {\n return window.Papa;\n }\n\n await loadScript(CDN_PAPAPARSE);\n\n if (typeof window.Papa === 'undefined') {\n throw new Error('PapaParse did not register on window.');\n }\n\n return window.Papa;\n}\n\nfunction extensionOf(name: string): string {\n const i = name.lastIndexOf('.');\n\n return i >= 0 ? name.slice(i + 1).toLowerCase() : '';\n}\n\ntype CellValue = string | number | boolean | null;\n\ntype ParsedPayload = {\n headers: string[];\n rows: Record[];\n};\n\ntype ColumnDef = {\n data: string;\n type: 'text' | 'numeric' | 'checkbox';\n};\n\nfunction normalizeCellValue(value: unknown): CellValue {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (value instanceof Date) {\n return value.toISOString().slice(0, 10);\n }\n\n const text = String(value).trim();\n\n return text === '' ? null : text;\n}\n\nfunction mapRowByHeaders(row: Record, headers: string[]): Record {\n const out: Record = {};\n\n for (const key of headers) {\n out[key] = normalizeCellValue(row[key]);\n }\n\n return out;\n}\n\ntype PapaParseResults = {\n data: Record[];\n errors: { message?: string }[];\n meta: { fields?: string[] };\n};\n\nfunction processPapaResults(results: PapaParseResults): ParsedPayload {\n if (results.errors.length > 0) {\n throw new Error(results.errors[0].message || 'CSV parse error.');\n }\n\n const fields = results.meta.fields?.filter((f) => f !== undefined && f !== '') ?? [];\n\n if (fields.length === 0) {\n throw new Error('No header row found in the CSV.');\n }\n\n const rows = results.data.map((row) => mapRowByHeaders(row, fields));\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers: fields, rows };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction parseCsvText(text: string, PapaRef: any): ParsedPayload {\n const trimmed = text.trim();\n\n if (!trimmed) {\n throw new Error('The file is empty.');\n }\n\n const parsed = PapaRef.parse(trimmed, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n }) as PapaParseResults;\n\n return processPapaResults(parsed);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function parseCsvFile(file: File, PapaRef: any): Promise {\n return new Promise((resolve, reject) => {\n PapaRef.parse(file, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n transformHeader: (h: string) => h.trim(),\n complete: (results: PapaParseResults) => {\n try {\n resolve(processPapaResults(results));\n } catch (e) {\n reject(e instanceof Error ? e : new Error(String(e)));\n }\n },\n error: (err: unknown) => reject(err instanceof Error ? err : new Error(String(err))),\n });\n });\n}\n\nasync function parseXlsxFile(file: File): Promise {\n // A throwaway grid in a hidden element runs the ImportFile plugin. `apply: false` returns the\n // mapped sheet without touching the grid, and a refused file rejects with a message that says why.\n const host = document.createElement('div');\n\n host.hidden = true;\n document.body.appendChild(host);\n\n const parser = new Handsontable(host, {\n data: [[]],\n importFile: true,\n licenseKey: 'non-commercial-and-evaluation',\n });\n\n try {\n const result = await parser.getPlugin('importFile').importFromBlob('xlsx', file, {\n colHeaders: 'firstRow',\n apply: false,\n });\n const rawHeaders = (Array.isArray(result.colHeaders) ? result.colHeaders : []) as unknown[];\n const headers = rawHeaders.map((cell, i) => {\n const text = String(cell ?? '').trim();\n\n return text === '' ? `Column ${i + 1}` : text;\n });\n\n if (headers.length === 0) {\n throw new Error('No header row found in the Excel sheet.');\n }\n\n const rows: Record[] = [];\n\n for (const line of result.data as unknown[][]) {\n const obj: Record = {};\n let allEmpty = true;\n\n headers.forEach((key, c) => {\n obj[key] = normalizeCellValue(line[c]);\n allEmpty = allEmpty && obj[key] === null;\n });\n\n if (!allEmpty) {\n rows.push(obj);\n }\n }\n\n if (rows.length === 0) {\n throw new Error('No data rows after the header.');\n }\n\n return { headers, rows };\n } finally {\n parser.destroy();\n host.remove();\n }\n}\n\nasync function parseFile(file: File): Promise {\n const ext = extensionOf(file.name);\n\n if (ext === 'csv') {\n const PapaRef = await ensurePapa();\n\n return parseCsvFile(file, PapaRef);\n }\n\n if (ext === 'xlsx') {\n return parseXlsxFile(file);\n }\n\n throw new Error('Unsupported file type. Use a .csv or .xlsx file.');\n}\n\nfunction columnsFromHeaders(headers: string[], rows: Record[]): ColumnDef[] {\n return headers.map((data) => {\n const values = rows\n .map((row) => row[data])\n .filter((v) => v !== null);\n\n if (values.length > 0 && values.every((v) => typeof v === 'number')) {\n return { data, type: 'numeric' as const };\n }\n\n if (values.length > 0 && values.every((v) => typeof v === 'boolean')) {\n return { data, type: 'checkbox' as const };\n }\n\n return { data, type: 'text' as const };\n });\n}\n\n/* start:skip-in-preview */\nconst SAMPLE_CSV = `Product,Category,In stock,Price\nWidget A,Hardware,true,19.99\nWidget B,Hardware,false,24.5\nService Pack,Services,true,0`;\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n const [errorMessage, setErrorMessage] = useState('');\n const [dropzoneActive, setDropzoneActive] = useState(false);\n const [gridData, setGridData] = useState[]>([]);\n const [gridColHeaders, setGridColHeaders] = useState([]);\n const [gridColumns, setGridColumns] = useState([]);\n\n const loadIntoGrid = ({ headers, rows }: ParsedPayload): void => {\n setErrorMessage('');\n setGridColHeaders(headers);\n setGridColumns(columnsFromHeaders(headers, rows));\n setGridData(rows);\n };\n\n const handleError = (e: unknown): void => {\n setErrorMessage(e instanceof Error ? e.message : String(e));\n };\n\n const handleFile = async (file: File | undefined): Promise => {\n setErrorMessage('');\n\n if (!file) {\n return;\n }\n\n if (file.size === 0) {\n setErrorMessage('The file is empty.');\n\n return;\n }\n\n try {\n const payload = await parseFile(file);\n\n loadIntoGrid(payload);\n } catch (e) {\n handleError(e);\n }\n };\n\n const handleFileInputChange = (ev: React.ChangeEvent): void => {\n const f = ev.target.files?.[0];\n\n handleFile(f);\n ev.target.value = '';\n };\n\n const handleDragOver = (ev: React.DragEvent): void => {\n ev.preventDefault();\n setDropzoneActive(true);\n };\n\n const handleDragLeave = (): void => {\n setDropzoneActive(false);\n };\n\n const handleDrop = (ev: React.DragEvent): void => {\n ev.preventDefault();\n setDropzoneActive(false);\n const f = ev.dataTransfer?.files?.[0];\n\n handleFile(f);\n };\n\n const handleLoadSample = async (): Promise => {\n setErrorMessage('');\n\n try {\n const PapaRef = await ensurePapa();\n const payload = parseCsvText(SAMPLE_CSV, PapaRef);\n\n loadIntoGrid(payload);\n } catch (e) {\n handleError(e);\n }\n };\n\n return (\n
    \n \n

    \n Drop a .csv or .xlsx file here, or pick a source.\n

    \n
    \n \n \n
    \n
    \n\n {errorMessage && (\n
    {errorMessage}
    \n )}\n\n {gridData.length === 0 ? (\n
    \n \n \n \n \n \n \n

    No data loaded yet

    \n

    \n Drop a CSV or Excel file above, choose a file, or load the sample data to populate the table.\n

    \n
    \n ) : (\n \n )}\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/react/example1.tsx","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__vue__example1.vue.json b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__vue__example1.vue.json index 522b8f203..b849d0057 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__vue__example1.vue.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__import-export__import-csv-excel__vue__example1.vue.json @@ -1 +1 @@ -{"framework":"vue","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/vue3\": \"0.0.0-next-36242d6-20261027\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"papaparse\": \"5.7.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n cursor: pointer;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/vue/example1.vue","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"Vue 3"} +{"framework":"vue","displayName":"Recipes ▸ Import Export ▸ Import from CSV or Excel · Standard example · Vue 3","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"vue","htWrappers":["@handsontable/vue3"],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":"pnpm exec vite --host 0.0.0.0 --port 5173","buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":5173,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-vue-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/vue3\": \"0.0.0-next-193d031-20261028\",\n \"vue\": \"3.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-vue\": \"^5.0.0\",\n \"papaparse\": \"5.7.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\n\nexport default defineConfig({ plugins: [vue()], server: { allowedHosts: true } });","/index.html":"\n\n\n \n \n Handsontable Vue Example\n\n\n
    \n \n\n","/src/main.ts":"import { createApp } from \"vue\";\nimport \"./styles.css\";\nimport App from \"./App.vue\";\ncreateApp(App).mount(\"#example1\");","/src/App.vue":"\n\n","/src/styles.css":".import-csv-excel-wrap {\n display: flex;\n flex-direction: column;\n margin: 0 -1rem;\n}\n\n.import-dropzone {\n padding: 1.5rem 1rem;\n text-align: center;\n border: 0;\n border-bottom: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: transparent;\n color: var(--sl-color-gray-2, #555555);\n font-size: var(--sl-text-xs, 0.75rem);\n transition: background 0.15s ease;\n cursor: pointer;\n}\n\n.import-dropzone p {\n margin: 0 0 0.75rem;\n}\n\n.import-dropzone.import-dropzone--active {\n background: var(--sl-color-gray-6, #eeeeee);\n}\n\n.import-actions {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.import-file-label {\n display: inline-block;\n cursor: pointer;\n}\n\n.import-file-label span,\n.import-sample-btn {\n display: inline-flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n border-radius: 0;\n background: var(--sl-color-gray-6, #eeeeee);\n color: var(--sl-color-gray-2, #555555);\n font-family: var(--sl-font, Inter, system-ui, -apple-system, sans-serif);\n font-size: var(--sl-text-xs, 0.75rem);\n font-weight: 500;\n line-height: 1.4;\n cursor: pointer;\n transition: background-color 0.15s, color 0.15s, border-color 0.15s;\n}\n\n.import-file-label:hover span,\n.import-sample-btn:hover {\n background: var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-white, #333333);\n}\n\n.import-file-label input {\n position: absolute;\n width: 1px;\n height: 1px;\n opacity: 0;\n pointer-events: none;\n}\n\n.import-msg {\n margin: 0;\n padding: 0.75rem 1rem;\n border-radius: 0;\n font-size: var(--sl-text-xs, 0.75rem);\n}\n\n.import-msg--error {\n border-bottom: 1px solid var(--sl-color-red, #ef4444);\n background: var(--sl-color-red-low, rgba(239, 68, 68, 0.12));\n color: var(--sl-color-red, #ef4444);\n}\n\n.import-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2.5rem 1rem;\n min-height: 200px;\n color: var(--sl-color-gray-2, #555555);\n text-align: center;\n}\n\n.import-empty-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n margin-bottom: 0.25rem;\n border: 1px solid var(--sl-color-gray-5, #e0e0e0);\n color: var(--sl-color-gray-3, #777777);\n}\n\n.import-empty-title {\n margin: 0;\n color: var(--sl-color-white, #333333);\n font-size: var(--sl-text-sm, 0.875rem);\n font-weight: 600;\n}\n\n.import-empty-text {\n margin: 0;\n max-width: 38ch;\n font-size: var(--sl-text-xs, 0.75rem);\n line-height: 1.5;\n}"},"docsPath":"recipes/import-export/import-csv-excel/vue/example1.vue","breadcrumb":["Recipes","Import Export","Import from CSV or Excel"],"guide":"recipes/import-export/import-csv-excel/import-csv-excel.md","guideTitle":"Import from CSV or Excel","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/import-export/import-csv-excel","lang":"Vue 3"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__angular__example1.ts.json index 5fec4e60c..c2d3799e8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-expensive-cell-renderer',\n styles: [`\n .render-stats {\n margin: 8px 0 0;\n font-size: 13px;\n color: #666;\n }\n `],\n template: `\n
    \n
    \n \n \n
    \n
    \n \n

    Renderer calls: 0 | Computations: 0

    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('statsLine', { static: true }) readonly statsLine!: ElementRef;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n // Runs once per draw, scroll draws included, after every cell renderer. The grid runs outside\n // Angular's zone, and the first draw happens during `ngAfterViewInit`. Write the counters\n // straight into the element instead of into a bound property: a bound property set from here\n // costs a whole-application change-detection pass on every draw, and on the first draw it\n // raises NG0100 (ExpressionChangedAfterItHasBeenCheckedError).\n afterViewRender: () => {\n this.statsLine.nativeElement.textContent =\n `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n };\n\n renderAgain(): void {\n this.hotTable?.hotInstance?.render();\n }\n\n updateFirstRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/expensive-cell-renderer/angular/example1.ts","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ElementRef, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-expensive-cell-renderer',\n styles: [`\n .render-stats {\n margin: 8px 0 0;\n font-size: 13px;\n color: #666;\n }\n `],\n template: `\n
    \n
    \n \n \n
    \n
    \n \n

    Renderer calls: 0 | Computations: 0

    \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('statsLine', { static: true }) readonly statsLine!: ElementRef;\n\n readonly data = data;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n // Runs once per draw, scroll draws included, after every cell renderer. The grid runs outside\n // Angular's zone, and the first draw happens during `ngAfterViewInit`. Write the counters\n // straight into the element instead of into a bound property: a bound property set from here\n // costs a whole-application change-detection pass on every draw, and on the first draw it\n // raises NG0100 (ExpressionChangedAfterItHasBeenCheckedError).\n afterViewRender: () => {\n this.statsLine.nativeElement.textContent =\n `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n };\n\n renderAgain(): void {\n this.hotTable?.hotInstance?.render();\n }\n\n updateFirstRow(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/expensive-cell-renderer/angular/example1.ts","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.js.json index fa50ddfd5..04cd63174 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n
    \n
    \n

    Renderer calls: 0 | Computations: 0

    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { baseRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count) {\n const rows = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales) {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst container = document.querySelector('#example1');\nconst statsElement = document.querySelector('#render-stats');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n // Runs once per draw, scroll draws included, after every cell renderer. Keep DOM writes like\n // this one out of the renderer.\n afterViewRender() {\n statsElement.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n});\n\ndocument.querySelector('#render-again-btn').addEventListener('click', () => {\n hot.render();\n});\n\ndocument.querySelector('#update-row-btn').addEventListener('click', () => {\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/expensive-cell-renderer/javascript/example1.js","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n
    \n
    \n

    Renderer calls: 0 | Computations: 0

    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { baseRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count) {\n const rows = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales) {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst container = document.querySelector('#example1');\nconst statsElement = document.querySelector('#render-stats');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n // Runs once per draw, scroll draws included, after every cell renderer. Keep DOM writes like\n // this one out of the renderer.\n afterViewRender() {\n statsElement.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n});\n\ndocument.querySelector('#render-again-btn').addEventListener('click', () => {\n hot.render();\n});\n\ndocument.querySelector('#update-row-btn').addEventListener('click', () => {\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/expensive-cell-renderer/javascript/example1.js","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.ts.json index 56d4977ef..695626d5a 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n
    \n
    \n

    Renderer calls: 0 | Computations: 0

    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst container = document.querySelector('#example1')!;\nconst statsElement = document.querySelector('#render-stats')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n // Runs once per draw, scroll draws included, after every cell renderer. Keep DOM writes like\n // this one out of the renderer.\n afterViewRender() {\n statsElement.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n});\n\ndocument.querySelector('#render-again-btn')!.addEventListener('click', () => {\n hot.render();\n});\n\ndocument.querySelector('#update-row-btn')!.addEventListener('click', () => {\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/performance/expensive-cell-renderer/javascript/example1.ts","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n \n
    \n
    \n
    \n

    Renderer calls: 0 | Computations: 0

    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst container = document.querySelector('#example1')!;\nconst statsElement = document.querySelector('#render-stats')!;\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['ID', 'Customer', 'Region', 'Trend (12 months)'],\n columns: [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n ],\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n // Runs once per draw, scroll draws included, after every cell renderer. Keep DOM writes like\n // this one out of the renderer.\n afterViewRender() {\n statsElement.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n },\n});\n\ndocument.querySelector('#render-again-btn')!.addEventListener('click', () => {\n hot.render();\n});\n\ndocument.querySelector('#update-row-btn')!.addEventListener('click', () => {\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/performance/expensive-cell-renderer/javascript/example1.ts","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__react__example1.tsx.json index 2ae68121e..8753ea596 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__expensive-cell-renderer__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst COLUMNS: ColumnSettings[] = [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const statsRef = useRef(null);\n\n // Runs once per draw, scroll draws included, after every cell renderer. The counters change on\n // every draw, so write them straight into the DOM rather than into React state, which would\n // re-render the component on every draw.\n const handleAfterViewRender = useCallback(() => {\n if (statsRef.current) {\n statsRef.current.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n }\n }, []);\n\n const renderAgain = useCallback(() => {\n hotRef.current?.hotInstance?.render();\n }, []);\n\n const updateFirstRow = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n }, []);\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n \n

    \n Renderer calls: 0 | Computations: 0\n

    \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/expensive-cell-renderer/react/example1.tsx","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Performance ▸ Cache the output of an expensive cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, baseRenderer, textRenderer } from 'handsontable/renderers';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\ntype OrderRow = {\n id: number;\n customer: string;\n region: string;\n sales: number[];\n};\n\n/* start:skip-in-preview */\nconst CUSTOMERS = ['Acme Corp', 'Vertex Industries', 'Harbor Goods', 'Alpine Supply Co.', 'Northwind Traders', 'Lumen Retail'];\nconst REGIONS = ['North', 'South', 'East', 'West'];\n\n// Twelve monthly sales figures per customer, generated deterministically so every load looks the same.\nfunction createRows(count: number): OrderRow[] {\n const rows: OrderRow[] = [];\n\n for (let index = 0; index < count; index += 1) {\n const sales: number[] = [];\n let seed = (index + 1) * 7919;\n\n for (let month = 0; month < 12; month += 1) {\n seed = (seed * 48271) % 2147483647;\n sales.push(1000 + (seed % 9000));\n }\n\n rows.push({\n id: 1001 + index,\n customer: CUSTOMERS[index % CUSTOMERS.length],\n region: REGIONS[index % REGIONS.length],\n sales,\n });\n }\n\n return rows;\n}\n/* end:skip-in-preview */\n\nconst data = createRows(300);\nconst stats = { rendererCalls: 0, computations: 0 };\n\n// The slow part of the renderer: a text sparkline plus the change from the first to the last month.\n// It is a pure function -- the same input always gives the same output -- so its result can be cached.\nfunction buildTrend(sales: number[]): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n const min = Math.min(...sales);\n const max = Math.max(...sales);\n const range = max - min || 1;\n const bars = sales\n .map((value) => glyphs[Math.round(((value - min) / range) * (glyphs.length - 1))])\n .join('');\n const change = Math.round(((sales[sales.length - 1] - sales[0]) / sales[0]) * 100);\n\n return `${bars} ${change >= 0 ? '+' : ''}${change}%`;\n}\n\n// One cache entry per data record, never per `td`: the grid reuses a `td` for a different record\n// as you scroll. A WeakMap releases the entry together with the record. Each entry remembers the\n// input it was computed from, so a replaced array is computed again.\nconst trendCache = new WeakMap();\n\nconst trendRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n stats.rendererCalls += 1;\n\n // `row` is a visual index, and `data` is in physical order, so translate before the lookup.\n // Read the record from your own array: `getSourceDataAtRow()` returns a copy of the row on\n // every call, which can never be a WeakMap key. Keep this closure and the grid's data source\n // the same array -- after `updateData()`, point it at the new one.\n const record = data[instance.toPhysicalRow(row)];\n const sales = value;\n\n // A row without a record (a `minSpareRows` row, or one mid-`alter()`) and an empty cell both\n // reach the renderer. Neither can be cached: `undefined` is not a valid WeakMap key.\n if (!record || !Array.isArray(sales) || sales.length === 0) {\n textRenderer(instance, td, row, col, prop, '—', cellProperties);\n\n return;\n }\n\n let entry = trendCache.get(record);\n\n if (!entry || entry.input !== sales) {\n stats.computations += 1;\n entry = { input: sales, output: buildTrend(sales) };\n trendCache.set(record, entry);\n }\n\n // Write through the built-in text renderer rather than setting `td.textContent`. On a row with\n // an exact height the engine keeps the cell's content inside a wrapper, and this writes into\n // that wrapper instead of replacing it.\n textRenderer(instance, td, row, col, prop, entry.output, cellProperties);\n};\n\nconst COLUMNS: ColumnSettings[] = [\n { data: 'id', type: 'numeric', width: 70, readOnly: true },\n { data: 'customer', type: 'text', width: 170 },\n { data: 'region', type: 'text', width: 90 },\n { data: 'sales', renderer: trendRenderer, width: 190, readOnly: true },\n];\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const statsRef = useRef(null);\n\n // Runs once per draw, scroll draws included, after every cell renderer. The counters change on\n // every draw, so write them straight into the DOM rather than into React state, which would\n // re-render the component on every draw.\n const handleAfterViewRender = useCallback(() => {\n if (statsRef.current) {\n statsRef.current.textContent = `Renderer calls: ${stats.rendererCalls} | Computations: ${stats.computations}`;\n }\n }, []);\n\n const renderAgain = useCallback(() => {\n hotRef.current?.hotInstance?.render();\n }, []);\n\n const updateFirstRow = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n // Bring the first row into view, so its renderer runs and the counter shows the single\n // recomputation. A cell outside the rendered band is not painted at all.\n hot.scrollViewportTo({ row: 0 });\n\n // Replace the array instead of changing it in place: the renderer compares inputs by identity.\n const nextSales = data[0].sales.map((value, month) => Math.round(value * (1 + month / 10)));\n\n hot.setSourceDataAtCell(0, 'sales', nextSales);\n }, []);\n\n return (\n
    \n
    \n
    \n \n \n
    \n
    \n \n

    \n Renderer calls: 0 | Computations: 0\n

    \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/expensive-cell-renderer/react/example1.tsx","breadcrumb":["Recipes","Performance","Cache the output of an expensive cell renderer"],"guide":"recipes/performance/expensive-cell-renderer/expensive-cell-renderer.md","guideTitle":"Cache the output of an expensive cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/expensive-cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__angular__example1.ts.json index 25ea0dc1a..bfe5be70c 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, OnInit, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\ntype TaskRow = {\n id: number;\n title: string;\n completed: boolean;\n userId: number;\n};\n\nconst INITIAL_DATA: TaskRow[] = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-lazy-loading',\n styles: [`\n .status-line {\n padding: 8px;\n text-align: center;\n color: #666;\n font-size: 13px;\n }\n `],\n template: `\n \n
    {{ statusText }}
    \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n loadedData: TaskRow[] = [...INITIAL_DATA];\n // Always visible -- no blinking; text only changes at end-of-data or on error\n statusText = 'Scroll table to load more records';\n\n private currentPage = 1;\n private isLoading = false;\n private hasMore = true;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task Title', 'Status', 'Assignee'],\n columns: [\n { data: 'title', type: 'text', width: 400 },\n { data: 'completed', type: 'checkbox', width: 80, className: 'htCenter' },\n { data: 'userId', type: 'numeric', width: 100 },\n ],\n rowHeaders: true,\n height: 400,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n loading: true,\n afterScrollVertically: () => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const lastVisibleRow = (hot as any).view.getLastFullyVisibleRow();\n const totalRows = hot.countRows();\n\n if (lastVisibleRow >= 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n this.fetchNextPage();\n }\n },\n };\n\n ngOnInit(): void {\n this.fetchNextPage();\n }\n\n private async fetchNextPage(): Promise {\n if (this.isLoading || !this.hasMore) {\n return;\n }\n\n this.isLoading = true;\n this.hotTable?.hotInstance?.getPlugin('loading').show();\n\n try {\n const nextPage = this.currentPage + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows: TaskRow[] = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n this.hasMore = false;\n this.statusText = 'All tasks loaded.';\n } else {\n this.currentPage = nextPage;\n // Push rows in a loop to avoid stack overflow with large arrays\n newRows.forEach((row) => this.loadedData.push(row));\n // `updateData()` appends rows without resetting scroll position\n this.hotTable?.hotInstance?.updateData(this.loadedData);\n }\n } catch {\n this.statusText = 'Failed to load more tasks. Scroll down to retry.';\n this.isLoading = false;\n this.hotTable?.hotInstance?.getPlugin('loading').hide();\n this.cdr.markForCheck();\n\n return;\n }\n\n this.isLoading = false;\n this.hotTable?.hotInstance?.getPlugin('loading').hide();\n this.cdr.markForCheck();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/lazy-loading/angular/example1.ts","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { ChangeDetectorRef, Component, OnInit, ViewChild, inject } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\n\n/* start:skip-in-preview */\ntype TaskRow = {\n id: number;\n title: string;\n completed: boolean;\n userId: number;\n};\n\nconst INITIAL_DATA: TaskRow[] = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-lazy-loading',\n styles: [`\n .status-line {\n padding: 8px;\n text-align: center;\n color: #666;\n font-size: 13px;\n }\n `],\n template: `\n \n
    {{ statusText }}
    \n `,\n})\nexport class AppComponent implements OnInit {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n loadedData: TaskRow[] = [...INITIAL_DATA];\n // Always visible -- no blinking; text only changes at end-of-data or on error\n statusText = 'Scroll table to load more records';\n\n private currentPage = 1;\n private isLoading = false;\n private hasMore = true;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Task Title', 'Status', 'Assignee'],\n columns: [\n { data: 'title', type: 'text', width: 400 },\n { data: 'completed', type: 'checkbox', width: 80, className: 'htCenter' },\n { data: 'userId', type: 'numeric', width: 100 },\n ],\n rowHeaders: true,\n height: 400,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n loading: true,\n afterScrollVertically: () => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const lastVisibleRow = (hot as any).view.getLastFullyVisibleRow();\n const totalRows = hot.countRows();\n\n if (lastVisibleRow >= 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n this.fetchNextPage();\n }\n },\n };\n\n ngOnInit(): void {\n this.fetchNextPage();\n }\n\n private async fetchNextPage(): Promise {\n if (this.isLoading || !this.hasMore) {\n return;\n }\n\n this.isLoading = true;\n this.hotTable?.hotInstance?.getPlugin('loading').show();\n\n try {\n const nextPage = this.currentPage + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows: TaskRow[] = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n this.hasMore = false;\n this.statusText = 'All tasks loaded.';\n } else {\n this.currentPage = nextPage;\n // Push rows in a loop to avoid stack overflow with large arrays\n newRows.forEach((row) => this.loadedData.push(row));\n // `updateData()` appends rows without resetting scroll position\n this.hotTable?.hotInstance?.updateData(this.loadedData);\n }\n } catch {\n this.statusText = 'Failed to load more tasks. Scroll down to retry.';\n this.isLoading = false;\n this.hotTable?.hotInstance?.getPlugin('loading').hide();\n this.cdr.markForCheck();\n\n return;\n }\n\n this.isLoading = false;\n this.hotTable?.hotInstance?.getPlugin('loading').hide();\n this.cdr.markForCheck();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/lazy-loading/angular/example1.ts","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__javascript__example1.js.json index 56b598fda..bc1c2f361 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst INITIAL_DATA = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\n// Pagination state\nlet currentPage = 1;\nlet isLoading = false;\nlet hasMore = true;\nlet loadedData = [...INITIAL_DATA];\n\n// Number of rows from the bottom that triggers the next page fetch\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\nconst container = document.querySelector('#example1');\n\n// Persistent status line below the grid -- always visible, never blinks\nconst statusEl = document.createElement('div');\n\nstatusEl.style.cssText = 'padding:8px; text-align:center; color:#666; font-size:13px;';\nstatusEl.textContent = 'Scroll table to load more records';\ncontainer.insertAdjacentElement('afterend', statusEl);\n\n/**\n * Fetches the next page of tasks from the JSONPlaceholder API and appends\n * the rows to the grid using `updateData()`. This method preserves scroll\n * position and column state -- unlike `loadData()`, which resets both.\n */\nasync function fetchNextPage() {\n if (isLoading || !hasMore) {\n return;\n }\n\n isLoading = true;\n hot.getPlugin('loading').show();\n\n try {\n const nextPage = currentPage + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n hasMore = false;\n statusEl.textContent = 'All tasks loaded.';\n } else {\n currentPage = nextPage;\n loadedData = [...loadedData, ...newRows];\n // `updateData()` replaces the data source without resetting scroll\n // position, selection, or column configuration.\n hot.updateData(loadedData);\n }\n } catch {\n statusEl.textContent = 'Failed to load more tasks. Scroll down to retry.';\n isLoading = false;\n hot.getPlugin('loading').hide();\n\n return;\n }\n\n isLoading = false;\n hot.getPlugin('loading').hide();\n}\n\nconst hot = new Handsontable(container, {\n data: loadedData,\n colHeaders: ['Task Title', 'Status', 'Assignee'],\n columns: [\n { data: 'title', type: 'text', width: 400 },\n { data: 'completed', type: 'checkbox', width: 80, className: 'htCenter' },\n { data: 'userId', type: 'numeric', width: 100 },\n ],\n rowHeaders: true,\n height: 400,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n loading: true,\n afterScrollVertically() {\n // `lastVisibleRow` is the visual index of the last fully visible row.\n const lastVisibleRow = this.view.getLastFullyVisibleRow();\n const totalRows = this.countRows();\n\n // Trigger a fetch when the user is within LOAD_THRESHOLD rows of the\n // last loaded row. Using `>= 0` guards against -1 when no rows are\n // visible yet (e.g., during initial render).\n if (lastVisibleRow >= 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n fetchNextPage();\n }\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Load the first remote page on initialization. The grid already shows\n// INITIAL_DATA; this call replaces it with server data so the example\n// works even without a real backend when the network is unavailable.\nfetchNextPage();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/lazy-loading/javascript/example1.js","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst INITIAL_DATA = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\n// Pagination state\nlet currentPage = 1;\nlet isLoading = false;\nlet hasMore = true;\nlet loadedData = [...INITIAL_DATA];\n\n// Number of rows from the bottom that triggers the next page fetch\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\nconst container = document.querySelector('#example1');\n\n// Persistent status line below the grid -- always visible, never blinks\nconst statusEl = document.createElement('div');\n\nstatusEl.style.cssText = 'padding:8px; text-align:center; color:#666; font-size:13px;';\nstatusEl.textContent = 'Scroll table to load more records';\ncontainer.insertAdjacentElement('afterend', statusEl);\n\n/**\n * Fetches the next page of tasks from the JSONPlaceholder API and appends\n * the rows to the grid using `updateData()`. This method preserves scroll\n * position and column state -- unlike `loadData()`, which resets both.\n */\nasync function fetchNextPage() {\n if (isLoading || !hasMore) {\n return;\n }\n\n isLoading = true;\n hot.getPlugin('loading').show();\n\n try {\n const nextPage = currentPage + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n hasMore = false;\n statusEl.textContent = 'All tasks loaded.';\n } else {\n currentPage = nextPage;\n loadedData = [...loadedData, ...newRows];\n // `updateData()` replaces the data source without resetting scroll\n // position, selection, or column configuration.\n hot.updateData(loadedData);\n }\n } catch {\n statusEl.textContent = 'Failed to load more tasks. Scroll down to retry.';\n isLoading = false;\n hot.getPlugin('loading').hide();\n\n return;\n }\n\n isLoading = false;\n hot.getPlugin('loading').hide();\n}\n\nconst hot = new Handsontable(container, {\n data: loadedData,\n colHeaders: ['Task Title', 'Status', 'Assignee'],\n columns: [\n { data: 'title', type: 'text', width: 400 },\n { data: 'completed', type: 'checkbox', width: 80, className: 'htCenter' },\n { data: 'userId', type: 'numeric', width: 100 },\n ],\n rowHeaders: true,\n height: 400,\n width: '100%',\n stretchH: 'all',\n autoWrapRow: true,\n loading: true,\n afterScrollVertically() {\n // `lastVisibleRow` is the visual index of the last fully visible row.\n const lastVisibleRow = this.view.getLastFullyVisibleRow();\n const totalRows = this.countRows();\n\n // Trigger a fetch when the user is within LOAD_THRESHOLD rows of the\n // last loaded row. Using `>= 0` guards against -1 when no rows are\n // visible yet (e.g., during initial render).\n if (lastVisibleRow >= 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n fetchNextPage();\n }\n },\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Load the first remote page on initialization. The grid already shows\n// INITIAL_DATA; this call replaces it with server data so the example\n// works even without a real backend when the network is unavailable.\nfetchNextPage();","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/lazy-loading/javascript/example1.js","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__react__example1.tsx.json index 1343db9b4..2465be349 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__lazy-loading__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useCallback, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype TaskRow = {\n id: number;\n title: string;\n completed: boolean;\n userId: number;\n};\n\nconst INITIAL_DATA: TaskRow[] = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const currentPage = useRef(1);\n const isLoading = useRef(false);\n const hasMore = useRef(true);\n const loadedData = useRef([...INITIAL_DATA]);\n // Always visible -- no blinking; text only changes at end-of-data or on error\n const [statusText, setStatusText] = useState('Scroll table to load more records');\n\n const fetchNextPage = useCallback(async (): Promise => {\n if (isLoading.current || !hasMore.current) {\n return;\n }\n\n isLoading.current = true;\n hotRef.current?.hotInstance?.getPlugin('loading').show();\n\n try {\n const nextPage = currentPage.current + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows: TaskRow[] = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n hasMore.current = false;\n setStatusText('All tasks loaded.');\n } else {\n currentPage.current = nextPage;\n loadedData.current = [...loadedData.current, ...newRows];\n // `updateData()` appends rows without resetting scroll position\n hotRef.current?.hotInstance?.updateData(loadedData.current);\n }\n } catch {\n setStatusText('Failed to load more tasks. Scroll down to retry.');\n isLoading.current = false;\n hotRef.current?.hotInstance?.getPlugin('loading').hide();\n\n return;\n }\n\n isLoading.current = false;\n hotRef.current?.hotInstance?.getPlugin('loading').hide();\n }, []);\n\n useEffect(() => {\n fetchNextPage();\n }, [fetchNextPage]);\n\n return (\n <>\n = 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n fetchNextPage();\n }\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
    \n {statusText}\n
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/lazy-loading/react/example1.tsx","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Performance ▸ Lazy loading with pagination · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useState, useCallback, useEffect } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\ntype TaskRow = {\n id: number;\n title: string;\n completed: boolean;\n userId: number;\n};\n\nconst INITIAL_DATA: TaskRow[] = [\n { id: 1, title: 'Set up CI pipeline', completed: false, userId: 3 },\n { id: 2, title: 'Write unit tests for auth module', completed: true, userId: 1 },\n { id: 3, title: 'Review pull request #42', completed: false, userId: 2 },\n { id: 4, title: 'Update API documentation', completed: true, userId: 1 },\n { id: 5, title: 'Fix login redirect bug', completed: true, userId: 4 },\n { id: 6, title: 'Deploy staging environment', completed: false, userId: 3 },\n { id: 7, title: 'Implement dark mode toggle', completed: false, userId: 2 },\n { id: 8, title: 'Optimize database queries', completed: true, userId: 5 },\n { id: 9, title: 'Add error boundary components', completed: false, userId: 1 },\n { id: 10, title: 'Migrate to TypeScript', completed: false, userId: 2 },\n { id: 11, title: 'Set up monitoring alerts', completed: true, userId: 3 },\n { id: 12, title: 'Refactor form validation logic', completed: false, userId: 4 },\n { id: 13, title: 'Add keyboard shortcuts guide', completed: true, userId: 1 },\n { id: 14, title: 'Review security audit findings', completed: false, userId: 5 },\n { id: 15, title: 'Create onboarding checklist', completed: true, userId: 2 },\n { id: 16, title: 'Update dependencies to latest', completed: false, userId: 3 },\n { id: 17, title: 'Write release notes for v2.0', completed: false, userId: 1 },\n { id: 18, title: 'Set up feature flags service', completed: true, userId: 4 },\n { id: 19, title: 'Implement CSV export feature', completed: false, userId: 2 },\n { id: 20, title: 'Add pagination to task list', completed: true, userId: 5 },\n];\n/* end:skip-in-preview */\n\nconst LOAD_THRESHOLD = 5;\nconst PAGE_SIZE = 20;\n// JSONPlaceholder has 200 todos total (10 pages of 20)\nconst TOTAL_PAGES = 10;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n const currentPage = useRef(1);\n const isLoading = useRef(false);\n const hasMore = useRef(true);\n const loadedData = useRef([...INITIAL_DATA]);\n // Always visible -- no blinking; text only changes at end-of-data or on error\n const [statusText, setStatusText] = useState('Scroll table to load more records');\n\n const fetchNextPage = useCallback(async (): Promise => {\n if (isLoading.current || !hasMore.current) {\n return;\n }\n\n isLoading.current = true;\n hotRef.current?.hotInstance?.getPlugin('loading').show();\n\n try {\n const nextPage = currentPage.current + 1;\n const response = await fetch(\n `https://jsonplaceholder.typicode.com/todos?_page=${nextPage}&_limit=${PAGE_SIZE}`\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error: ${response.status}`);\n }\n\n const newRows: TaskRow[] = await response.json();\n\n if (newRows.length === 0 || nextPage >= TOTAL_PAGES) {\n hasMore.current = false;\n setStatusText('All tasks loaded.');\n } else {\n currentPage.current = nextPage;\n loadedData.current = [...loadedData.current, ...newRows];\n // `updateData()` appends rows without resetting scroll position\n hotRef.current?.hotInstance?.updateData(loadedData.current);\n }\n } catch {\n setStatusText('Failed to load more tasks. Scroll down to retry.');\n isLoading.current = false;\n hotRef.current?.hotInstance?.getPlugin('loading').hide();\n\n return;\n }\n\n isLoading.current = false;\n hotRef.current?.hotInstance?.getPlugin('loading').hide();\n }, []);\n\n useEffect(() => {\n fetchNextPage();\n }, [fetchNextPage]);\n\n return (\n <>\n = 0 && lastVisibleRow >= totalRows - LOAD_THRESHOLD) {\n fetchNextPage();\n }\n }}\n licenseKey=\"non-commercial-and-evaluation\"\n />\n
    \n {statusText}\n
    \n \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/lazy-loading/react/example1.tsx","breadcrumb":["Recipes","Performance","Lazy loading with pagination"],"guide":"recipes/performance/lazy-loading/lazy-loading.md","guideTitle":"Lazy loading with pagination","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/lazy-loading","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__angular__example1.ts.json index 244f79d15..079c13b2f 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\nconst DEFAULT_COL_WIDTHS: number[] = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER: number[] = [0, 1, 2, 3, 4, 5];\n\ntype SavedLayout = { widths: number[]; order: number[] };\n\nfunction loadLayout(): SavedLayout | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !Array.isArray((parsed as SavedLayout).widths) ||\n !Array.isArray((parsed as SavedLayout).order)\n ) {\n return null;\n }\n\n return parsed as SavedLayout;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(widths: number[], order: number[]): void {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-persist-column-layout',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Name', 'Category', 'Price ($)', 'Stock', 'Status'],\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n ],\n colWidths: initialWidths,\n manualColumnResize: true,\n manualColumnMove: initialOrder ?? true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n afterColumnResize: () => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n const widths = (hot.getColHeader() as string[]).map(\n (_, physicalIndex) => hot.getColWidth(hot.toVisualColumn(physicalIndex)!) as number\n );\n\n saveLayout(widths, this.getCurrentOrder());\n },\n afterColumnMove: (\n _movedColumns: number[],\n _finalIndex: number,\n _dropIndex: number | undefined,\n _movePossible: boolean,\n movePerformed: boolean\n ) => {\n if (!movePerformed) return;\n saveLayout(this.getCurrentWidths(), this.getCurrentOrder());\n },\n };\n\n resetLayout(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n localStorage.removeItem(STORAGE_KEY);\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n hot.render();\n }\n\n private getCurrentOrder(): number[] {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return DEFAULT_COL_ORDER;\n const count = hot.countCols();\n const order: number[] = [];\n\n for (let i = 0; i < count; i++) {\n order.push(hot.toPhysicalColumn(i) as number);\n }\n\n return order;\n }\n\n private getCurrentWidths(): number[] {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return DEFAULT_COL_WIDTHS;\n const count = hot.countCols();\n const widths: number[] = [];\n\n for (let i = 0; i < count; i++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(i)!) as number);\n }\n\n return widths;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/persist-column-layout/angular/example1.ts","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport type Handsontable from 'handsontable/base';\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\nconst data: Handsontable.RowObject[] = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\nconst DEFAULT_COL_WIDTHS: number[] = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER: number[] = [0, 1, 2, 3, 4, 5];\n\ntype SavedLayout = { widths: number[]; order: number[] };\n\nfunction loadLayout(): SavedLayout | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !Array.isArray((parsed as SavedLayout).widths) ||\n !Array.isArray((parsed as SavedLayout).order)\n ) {\n return null;\n }\n\n return parsed as SavedLayout;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(widths: number[], order: number[]): void {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-persist-column-layout',\n template: `\n
    \n
    \n \n
    \n
    \n \n `,\n})\nexport class AppComponent {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly data = data;\n\n gridSettings: GridSettings = {\n colHeaders: ['SKU', 'Name', 'Category', 'Price ($)', 'Stock', 'Status'],\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n ],\n colWidths: initialWidths,\n manualColumnResize: true,\n manualColumnMove: initialOrder ?? true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n afterColumnResize: () => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n const widths = (hot.getColHeader() as string[]).map(\n (_, physicalIndex) => hot.getColWidth(hot.toVisualColumn(physicalIndex)!) as number\n );\n\n saveLayout(widths, this.getCurrentOrder());\n },\n afterColumnMove: (\n _movedColumns: number[],\n _finalIndex: number,\n _dropIndex: number | undefined,\n _movePossible: boolean,\n movePerformed: boolean\n ) => {\n if (!movePerformed) return;\n saveLayout(this.getCurrentWidths(), this.getCurrentOrder());\n },\n };\n\n resetLayout(): void {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return;\n localStorage.removeItem(STORAGE_KEY);\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n hot.render();\n }\n\n private getCurrentOrder(): number[] {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return DEFAULT_COL_ORDER;\n const count = hot.countCols();\n const order: number[] = [];\n\n for (let i = 0; i < count; i++) {\n order.push(hot.toPhysicalColumn(i) as number);\n }\n\n return order;\n }\n\n private getCurrentWidths(): number[] {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) return DEFAULT_COL_WIDTHS;\n const count = hot.countCols();\n const widths: number[] = [];\n\n for (let i = 0; i < count; i++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(i)!) as number);\n }\n\n return widths;\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/performance/persist-column-layout/angular/example1.ts","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__javascript__example1.js.json index 1b9ca023d..7b61f8557 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// Default column widths and order used when no saved layout exists.\nconst DEFAULT_COL_WIDTHS = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER = [0, 1, 2, 3, 4, 5];\n\n/**\n * Reads the saved layout from localStorage.\n * Returns null when the key is absent, unparseable, or from an older schema.\n */\nfunction loadLayout() {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n\n // Guard against stale data that lacks expected keys.\n if (!Array.isArray(parsed.widths) || !Array.isArray(parsed.order)) return null;\n\n return parsed;\n } catch {\n return null;\n }\n}\n\n/** Persists column widths and order to localStorage. */\nfunction saveLayout(widths, order) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Name', 'Category', 'Price ($)', 'Stock', 'Status'],\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n ],\n colWidths: initialWidths,\n manualColumnResize: true,\n manualColumnMove: initialOrder || true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Capture the new width array after every column resize and persist it.\n afterColumnResize() {\n const widths = hot.getColHeader().map((_, physicalIndex) =>\n hot.getColWidth(hot.toVisualColumn(physicalIndex))\n );\n\n saveLayout(widths, getCurrentOrder());\n },\n\n // Capture the new column order after every column move and persist it.\n afterColumnMove(_movedColumns, _finalIndex, _dropIndex, _movePossible, movePerformed) {\n if (!movePerformed) return;\n saveLayout(getCurrentWidths(), getCurrentOrder());\n },\n});\n\n/** Returns the current visual-to-physical column order as an array of physical indices. */\nfunction getCurrentOrder() {\n const count = hot.countCols();\n const order = [];\n\n for (let visualIndex = 0; visualIndex < count; visualIndex++) {\n order.push(hot.toPhysicalColumn(visualIndex));\n }\n\n return order;\n}\n\n/** Returns the current column widths in physical order, as `colWidths` expects them. */\nfunction getCurrentWidths() {\n const count = hot.countCols();\n const widths = [];\n\n for (let physicalIndex = 0; physicalIndex < count; physicalIndex++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(physicalIndex)));\n }\n\n return widths;\n}\n\n// Reset button: clear localStorage and restore the default layout.\ndocument.querySelector('#reset-layout-btn').addEventListener('click', () => {\n localStorage.removeItem(STORAGE_KEY);\n\n // Reset column order to the identity sequence [0, 1, 2, 3, 4, 5].\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n\n // Reset each column width through the ManualColumnResize plugin API.\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/persist-column-layout/javascript/example1.js","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n
    \n \n
    \n
    \n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\nconst data = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\n// Default column widths and order used when no saved layout exists.\nconst DEFAULT_COL_WIDTHS = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER = [0, 1, 2, 3, 4, 5];\n\n/**\n * Reads the saved layout from localStorage.\n * Returns null when the key is absent, unparseable, or from an older schema.\n */\nfunction loadLayout() {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n\n // Guard against stale data that lacks expected keys.\n if (!Array.isArray(parsed.widths) || !Array.isArray(parsed.order)) return null;\n\n return parsed;\n } catch {\n return null;\n }\n}\n\n/** Persists column widths and order to localStorage. */\nfunction saveLayout(widths, order) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['SKU', 'Name', 'Category', 'Price ($)', 'Stock', 'Status'],\n columns: [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n ],\n colWidths: initialWidths,\n manualColumnResize: true,\n manualColumnMove: initialOrder || true,\n rowHeaders: true,\n height: 320,\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n\n // Capture the new width array after every column resize and persist it.\n afterColumnResize() {\n const widths = hot.getColHeader().map((_, physicalIndex) =>\n hot.getColWidth(hot.toVisualColumn(physicalIndex))\n );\n\n saveLayout(widths, getCurrentOrder());\n },\n\n // Capture the new column order after every column move and persist it.\n afterColumnMove(_movedColumns, _finalIndex, _dropIndex, _movePossible, movePerformed) {\n if (!movePerformed) return;\n saveLayout(getCurrentWidths(), getCurrentOrder());\n },\n});\n\n/** Returns the current visual-to-physical column order as an array of physical indices. */\nfunction getCurrentOrder() {\n const count = hot.countCols();\n const order = [];\n\n for (let visualIndex = 0; visualIndex < count; visualIndex++) {\n order.push(hot.toPhysicalColumn(visualIndex));\n }\n\n return order;\n}\n\n/** Returns the current column widths in physical order, as `colWidths` expects them. */\nfunction getCurrentWidths() {\n const count = hot.countCols();\n const widths = [];\n\n for (let physicalIndex = 0; physicalIndex < count; physicalIndex++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(physicalIndex)));\n }\n\n return widths;\n}\n\n// Reset button: clear localStorage and restore the default layout.\ndocument.querySelector('#reset-layout-btn').addEventListener('click', () => {\n localStorage.removeItem(STORAGE_KEY);\n\n // Reset column order to the identity sequence [0, 1, 2, 3, 4, 5].\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n\n // Reset each column width through the ManualColumnResize plugin API.\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n\n hot.render();\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/performance/persist-column-layout/javascript/example1.js","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__react__example1.tsx.json index 06d5c0518..f1092cdce 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__performance__persist-column-layout__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\ntype ProductRow = {\n sku: string;\n name: string;\n category: string;\n price: number;\n stock: number;\n status: string;\n};\n\nconst data: ProductRow[] = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\nconst DEFAULT_COL_WIDTHS: number[] = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER: number[] = [0, 1, 2, 3, 4, 5];\n\nconst COLUMNS: ColumnSettings[] = [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n];\n\ntype SavedLayout = { widths: number[]; order: number[] };\n\nfunction loadLayout(): SavedLayout | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !Array.isArray((parsed as SavedLayout).widths) ||\n !Array.isArray((parsed as SavedLayout).order)\n ) {\n return null;\n }\n\n return parsed as SavedLayout;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(widths: number[], order: number[]): void {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const getCurrentOrder = useCallback((): number[] => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return DEFAULT_COL_ORDER;\n const count = hot.countCols();\n const order: number[] = [];\n\n for (let i = 0; i < count; i++) {\n order.push(hot.toPhysicalColumn(i) as number);\n }\n\n return order;\n }, []);\n\n const getCurrentWidths = useCallback((): number[] => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return DEFAULT_COL_WIDTHS;\n const count = hot.countCols();\n const widths: number[] = [];\n\n for (let i = 0; i < count; i++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(i)!) as number);\n }\n\n return widths;\n }, []);\n\n const handleAfterColumnResize = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n const widths = (hot.getColHeader() as string[]).map((_, physicalIndex) =>\n hot.getColWidth(hot.toVisualColumn(physicalIndex)!) as number\n );\n\n saveLayout(widths, getCurrentOrder());\n }, [getCurrentOrder]);\n\n const handleAfterColumnMove = useCallback(\n (\n _movedColumns: number[],\n _finalIndex: number,\n _dropIndex: number | undefined,\n _movePossible: boolean,\n movePerformed: boolean\n ) => {\n if (!movePerformed) return;\n saveLayout(getCurrentWidths(), getCurrentOrder());\n },\n [getCurrentWidths, getCurrentOrder]\n );\n\n const handleReset = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n localStorage.removeItem(STORAGE_KEY);\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n hot.render();\n }, []);\n\n return (\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/persist-column-layout/react/example1.tsx","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Performance ▸ Persist and restore column widths and order · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useCallback, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\nconst STORAGE_KEY = 'ht-column-layout-v2';\n\n/* start:skip-in-preview */\ntype ProductRow = {\n sku: string;\n name: string;\n category: string;\n price: number;\n stock: number;\n status: string;\n};\n\nconst data: ProductRow[] = [\n { sku: 'SKU-001', name: 'Wireless Keyboard', category: 'Electronics', price: 49.99, stock: 142, status: 'Active' },\n { sku: 'SKU-002', name: 'USB-C Hub', category: 'Electronics', price: 34.99, stock: 87, status: 'Active' },\n { sku: 'SKU-003', name: 'Ergonomic Chair', category: 'Furniture', price: 399.00, stock: 23, status: 'Active' },\n { sku: 'SKU-004', name: 'Monitor Stand', category: 'Furniture', price: 79.99, stock: 55, status: 'Active' },\n { sku: 'SKU-005', name: 'Noise-Cancelling Headphones', category: 'Electronics', price: 199.99, stock: 0, status: 'Out of Stock' },\n { sku: 'SKU-006', name: 'Mechanical Keyboard', category: 'Electronics', price: 129.99, stock: 34, status: 'Active' },\n { sku: 'SKU-007', name: 'Standing Desk', category: 'Furniture', price: 549.00, stock: 12, status: 'Active' },\n { sku: 'SKU-008', name: 'Webcam HD', category: 'Electronics', price: 89.99, stock: 61, status: 'Active' },\n { sku: 'SKU-009', name: 'Cable Organizer', category: 'Accessories', price: 14.99, stock: 203, status: 'Active' },\n { sku: 'SKU-010', name: 'Laptop Stand', category: 'Accessories', price: 29.99, stock: 0, status: 'Discontinued' },\n { sku: 'SKU-011', name: 'Blue Light Glasses', category: 'Accessories', price: 24.99, stock: 98, status: 'Active' },\n { sku: 'SKU-012', name: 'Desk Lamp', category: 'Furniture', price: 44.99, stock: 77, status: 'Active' },\n];\n/* end:skip-in-preview */\n\nconst DEFAULT_COL_WIDTHS: number[] = [90, 200, 120, 90, 70, 110];\nconst DEFAULT_COL_ORDER: number[] = [0, 1, 2, 3, 4, 5];\n\nconst COLUMNS: ColumnSettings[] = [\n { data: 'sku', type: 'text' },\n { data: 'name', type: 'text' },\n { data: 'category', type: 'text' },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'stock', type: 'numeric' },\n { data: 'status', type: 'text' },\n];\n\ntype SavedLayout = { widths: number[]; order: number[] };\n\nfunction loadLayout(): SavedLayout | null {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n\n if (!raw) return null;\n const parsed: unknown = JSON.parse(raw);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !Array.isArray((parsed as SavedLayout).widths) ||\n !Array.isArray((parsed as SavedLayout).order)\n ) {\n return null;\n }\n\n return parsed as SavedLayout;\n } catch {\n return null;\n }\n}\n\nfunction saveLayout(widths: number[], order: number[]): void {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({ widths, order }));\n}\n\nconst saved = loadLayout();\nconst initialWidths = saved ? saved.widths : DEFAULT_COL_WIDTHS;\nconst initialOrder = saved ? saved.order : null;\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const getCurrentOrder = useCallback((): number[] => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return DEFAULT_COL_ORDER;\n const count = hot.countCols();\n const order: number[] = [];\n\n for (let i = 0; i < count; i++) {\n order.push(hot.toPhysicalColumn(i) as number);\n }\n\n return order;\n }, []);\n\n const getCurrentWidths = useCallback((): number[] => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return DEFAULT_COL_WIDTHS;\n const count = hot.countCols();\n const widths: number[] = [];\n\n for (let i = 0; i < count; i++) {\n widths.push(hot.getColWidth(hot.toVisualColumn(i)!) as number);\n }\n\n return widths;\n }, []);\n\n const handleAfterColumnResize = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n const widths = (hot.getColHeader() as string[]).map((_, physicalIndex) =>\n hot.getColWidth(hot.toVisualColumn(physicalIndex)!) as number\n );\n\n saveLayout(widths, getCurrentOrder());\n }, [getCurrentOrder]);\n\n const handleAfterColumnMove = useCallback(\n (\n _movedColumns: number[],\n _finalIndex: number,\n _dropIndex: number | undefined,\n _movePossible: boolean,\n movePerformed: boolean\n ) => {\n if (!movePerformed) return;\n saveLayout(getCurrentWidths(), getCurrentOrder());\n },\n [getCurrentWidths, getCurrentOrder]\n );\n\n const handleReset = useCallback(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) return;\n localStorage.removeItem(STORAGE_KEY);\n hot.columnIndexMapper.setIndexesSequence(DEFAULT_COL_ORDER);\n const resizePlugin = hot.getPlugin('manualColumnResize');\n\n DEFAULT_COL_WIDTHS.forEach((width, visualIndex) => {\n resizePlugin.setManualSize(visualIndex, width);\n });\n hot.render();\n }, []);\n\n return (\n
    \n
    \n
    \n \n
    \n
    \n \n
    \n );\n};\n\nexport default ExampleComponent;"},"docsPath":"recipes/performance/persist-column-layout/react/example1.tsx","breadcrumb":["Recipes","Performance","Persist and restore column widths and order"],"guide":"recipes/performance/persist-column-layout/persist-column-layout.md","guideTitle":"Persist and restore column widths and order","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/performance/persist-column-layout","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.js.json index d052f40ed..df0c46365 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Add AI-classified columns with Jev · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\n// The columns to add. `type` is the Jev question type: noul (yes or no),\n// score (one of ordered levels), choice (one option from a list).\nconst AI_COLUMNS = [\n {\n key: 'sentiment',\n name: 'Sentiment',\n type: 'score',\n prompt: 'How positive is this review overall?',\n options: ['Very negative', 'Negative', 'Mixed', 'Positive', 'Very positive'],\n },\n {\n key: 'category',\n name: 'Category',\n type: 'choice',\n prompt: 'Which category best fits the main issue in this review?',\n options: ['quality', 'shipping', 'price', 'support', 'usability'],\n },\n {\n key: 'needsReply',\n name: 'Needs reply',\n type: 'noul',\n prompt: 'Does this review warrant a reply from customer support?',\n },\n];\n\n/* start:skip-in-preview */\nconst reviews = [\n {\n id: 1,\n product: 'Wireless earbuds',\n review:\n \"Crisp sound, the case charges fast, and they pair instantly with my laptop. Easily the best pair I've owned under $100.\",\n },\n {\n id: 2,\n product: 'Wireless earbuds',\n review:\n \"Left bud died after nine days. Support sent a replacement without fuss, but I shouldn't have needed one this soon.\",\n },\n {\n id: 3,\n product: 'Standing desk',\n review:\n \"Motor is whisper quiet and the frame doesn't wobble at full height. Assembly took 40 minutes with clear instructions.\",\n },\n {\n id: 4,\n product: 'Standing desk',\n review: 'Great desk but shipping took 3 weeks and support never replied to my two emails asking where it was.',\n },\n {\n id: 5,\n product: 'Coffee grinder',\n review: \"Grind is consistent from espresso to French press. It's loud, but every burr grinder is.\",\n },\n {\n id: 6,\n product: 'Coffee grinder',\n review: 'Stopped working after two months. The hopper lid also cracked. Expected more for $180.',\n },\n {\n id: 7,\n product: 'Running shoes',\n review:\n 'Light, breathable, and the fit is true to size. Ran a half marathon in them the second week with no blisters.',\n },\n {\n id: 8,\n product: 'Running shoes',\n review:\n 'Comfortable shoe, but the sole started separating at the toe after 60 miles. Returned it, refund took 3 weeks.',\n },\n {\n id: 14,\n product: 'Mechanical keyboard',\n review: \"Two keys arrived dead. Support fixed it fast with a replacement, so I'm happy now, but the QA worries me.\",\n },\n {\n id: 24,\n product: 'Electric kettle',\n review: 'The kettle is good. The box arrived crushed and the lid was dented. Kept it anyway because it works.',\n },\n];\n\n// Jev's answers for the rows above, recorded from the API on 2026-10-08.\n// Keyed \":\". Score probabilities are per level index.\nconst RECORDED = {\n 'sentiment:1': { type: 'score', score: 4.0, confidence: 1.0, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0, 4: 1 } },\n 'sentiment:2': {\n type: 'score',\n score: 1.66,\n confidence: 0.72,\n probabilities: { 0: 0, 1: 0.33, 2: 0.67, 3: 0, 4: 0 },\n },\n 'sentiment:3': {\n type: 'score',\n score: 3.95,\n confidence: 0.96,\n probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.04, 4: 0.96 },\n },\n 'sentiment:4': {\n type: 'score',\n score: 1.95,\n confidence: 0.96,\n probabilities: { 0: 0, 1: 0.05, 2: 0.95, 3: 0, 4: 0 },\n },\n 'sentiment:5': {\n type: 'score',\n score: 3.05,\n confidence: 0.95,\n probabilities: { 0: 0, 1: 0, 2: 0.01, 3: 0.93, 4: 0.06 },\n },\n 'sentiment:6': { type: 'score', score: 0.2, confidence: 0.83, probabilities: { 0: 0.8, 1: 0.2, 2: 0, 3: 0, 4: 0 } },\n 'sentiment:7': {\n type: 'score',\n score: 3.98,\n confidence: 0.98,\n probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.02, 4: 0.98 },\n },\n 'sentiment:8': {\n type: 'score',\n score: 1.21,\n confidence: 0.81,\n probabilities: { 0: 0.01, 1: 0.77, 2: 0.22, 3: 0, 4: 0 },\n },\n 'sentiment:14': {\n type: 'score',\n score: 2.04,\n confidence: 0.97,\n probabilities: { 0: 0, 1: 0, 2: 0.96, 3: 0.04, 4: 0 },\n },\n 'sentiment:24': {\n type: 'score',\n score: 2.06,\n confidence: 0.94,\n probabilities: { 0: 0, 1: 0.01, 2: 0.92, 3: 0.07, 4: 0 },\n },\n 'category:1': { type: 'choice', choice: 'quality', confidence: 0.52 },\n 'category:2': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:3': { type: 'choice', choice: 'quality', confidence: 0.79 },\n 'category:4': { type: 'choice', choice: 'shipping', confidence: 0.86 },\n 'category:5': { type: 'choice', choice: 'usability', confidence: 0.62 },\n 'category:6': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:7': { type: 'choice', choice: 'usability', confidence: 0.46 },\n 'category:8': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:14': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:24': { type: 'choice', choice: 'shipping', confidence: 0.99 },\n 'needsReply:1': { type: 'noul', noul: 0.12 },\n 'needsReply:2': { type: 'noul', noul: 0.7 },\n 'needsReply:3': { type: 'noul', noul: 0.12 },\n 'needsReply:4': { type: 'noul', noul: 0.9 },\n 'needsReply:5': { type: 'noul', noul: 0.12 },\n 'needsReply:6': { type: 'noul', noul: 0.88 },\n 'needsReply:7': { type: 'noul', noul: 0.12 },\n 'needsReply:8': { type: 'noul', noul: 0.79 },\n 'needsReply:14': { type: 'noul', noul: 0.65 },\n 'needsReply:24': { type: 'noul', noul: 0.69 },\n};\n/* end:skip-in-preview */\n\n// Stand-in for the model: a recorded answer after a short delay, so the page\n// needs no backend. For the real model, send `{ type, prompt, options, row }`\n// to a proxy that holds your key (see Step 5 on the page).\nfunction classify(row, column) {\n const answer = RECORDED[`${column.key}:${row.id}`];\n\n return new Promise((resolve, reject) => {\n setTimeout(\n () => {\n if (answer) {\n resolve(answer);\n } else {\n reject(new Error('No answer'));\n }\n },\n 150 + Math.random() * 250,\n );\n });\n}\n\n// Which of Jev's fields go into the cells. A Noul is a single probability and\n// has no confidence field, so a Noul column gets no confidence column.\nfunction toCells(column, answer) {\n switch (answer.type) {\n case 'noul':\n return { value: answer.noul };\n case 'score': {\n // The level with the highest probability; `probabilities` is keyed by level index.\n const [best] = Object.entries(answer.probabilities).sort(([, a], [, b]) => b - a)[0];\n\n return { value: column.options?.[Number(best)] ?? String(answer.score), confidence: answer.confidence };\n }\n case 'choice':\n return { value: answer.choice, confidence: answer.confidence };\n default:\n return { value: '' };\n }\n}\n\n// Per-cell state, keyed \":\" so it survives sorting.\nconst pending = new Set();\nconst failed = new Map();\n\nfunction cellKey(instance, visualRow, column) {\n const row = instance.getSourceDataAtRow(instance.toPhysicalRow(visualRow));\n\n return `${column.key}:${row.id}`;\n}\n\nconst valueRenderer = (column) => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? value.toFixed(2) : (value ?? '');\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-error', failed.has(key));\n\n if (failed.has(key)) {\n td.textContent = 'err';\n td.title = failed.get(key) ?? '';\n } else {\n td.removeAttribute('title');\n }\n};\n\nconst confidenceRenderer = (column) => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? `${Math.round(value * 100)}%` : '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-low', typeof value === 'number' && value < 0.6);\n td.classList.toggle('ai-high', typeof value === 'number' && value > 0.85);\n};\n\nconst rootContainer = document.querySelector('#example1');\n\n// Inject the controls row and the grid mount point inside #example1.\nrootContainer.innerHTML = `\n
    \n
    \n \n \n
    \n
    \n
    \n`;\n\nconst button = rootContainer.querySelector('.ai-classify');\nconst status = rootContainer.querySelector('.ai-status');\n\nconst columns = [\n { data: 'id', readOnly: true, width: 50, className: 'htRight' },\n { data: 'product', readOnly: true, width: 140 },\n { data: 'review', readOnly: true, width: 380 },\n];\nconst headers = ['ID', 'Product', 'Review'];\n\nconst hot = new Handsontable(rootContainer.querySelector('.ai-columns-grid'), {\n data: reviews,\n columns,\n colHeaders: headers,\n columnSorting: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Runs `worker` over `items` with at most `limit` in flight.\nasync function runPool(items, limit, worker) {\n let next = 0;\n\n const lanes = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const item = items[next];\n\n next += 1;\n await worker(item);\n }\n });\n\n await Promise.all(lanes);\n}\n\nbutton.addEventListener('click', async () => {\n button.disabled = true;\n\n // 1. Add a value column per definition, a confidence column where Jev\n // returns one, and mark every new cell as pending.\n AI_COLUMNS.forEach((column) => {\n columns.push({\n data: column.key,\n readOnly: true,\n renderer: valueRenderer(column),\n width: 130,\n className: column.type === 'noul' ? 'htRight' : '',\n });\n headers.push(column.name);\n\n if (column.type !== 'noul') {\n columns.push({\n data: `${column.key}Confidence`,\n readOnly: true,\n renderer: confidenceRenderer(column),\n width: 125,\n className: 'htRight',\n });\n headers.push(`${column.name} conf.`);\n }\n\n reviews.forEach((row) => pending.add(`${column.key}:${row.id}`));\n });\n hot.updateSettings({ columns: [...columns], colHeaders: [...headers] });\n\n // 2. One request per cell, a few at a time. Results are written by physical\n // row, so a sort applied mid-fill cannot misplace them.\n const jobs = AI_COLUMNS.flatMap((column) => reviews.map((row) => ({ column, row })));\n let done = 0;\n\n await runPool(jobs, 4, async ({ column, row }) => {\n const key = `${column.key}:${row.id}`;\n const physicalRow = reviews.indexOf(row);\n\n try {\n const cells = toCells(column, await classify(row, column));\n\n hot.setSourceDataAtCell(physicalRow, column.key, cells.value);\n\n if (cells.confidence !== undefined) {\n hot.setSourceDataAtCell(physicalRow, `${column.key}Confidence`, cells.confidence);\n }\n } catch (error) {\n failed.set(key, error instanceof Error ? error.message : 'Request failed');\n } finally {\n pending.delete(key);\n done += 1;\n status.textContent = `${done} of ${jobs.length} answers`;\n hot.render();\n }\n });\n\n status.textContent = `Classified ${reviews.length} reviews.`;\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Grid mount point below the controls row. */\n.ai-columns-grid {\n margin-top: 8px;\n}\n\n.ai-status {\n margin-left: 12px;\n font-size: 0.9em;\n opacity: 0.8;\n}\n\n/* A cell waiting for the model's answer. The theme paints read-only cells with its own\n background, so these rules use !important to win. */\n@keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.handsontable tbody td.ai-pending {\n background-image: linear-gradient(\n 90deg,\n rgba(59, 130, 246, 0.08) 25%,\n rgba(59, 130, 246, 0.3) 50%,\n rgba(59, 130, 246, 0.08) 75%\n ) !important;\n background-size: 200% 100% !important;\n animation: aiShimmer 1.1s linear infinite;\n}\n\n/* A row the model could not answer. The tooltip carries the reason. */\n.handsontable tbody td.ai-error {\n color: #c62828;\n font-weight: 600;\n}\n\n/* Confidence bands: below 60% and above 85%. Everything in between stays neutral. */\n.handsontable tbody td.ai-low {\n background-color: rgba(239, 68, 68, 0.22) !important;\n}\n\n.handsontable tbody td.ai-high {\n background-color: rgba(34, 197, 94, 0.22) !important;\n}"},"docsPath":"recipes/real-time/ai-columns-jev/javascript/example1.js","breadcrumb":["Recipes","Real Time","Add AI-classified columns with Jev"],"guide":"recipes/real-time/ai-columns-jev/ai-columns-jev.md","guideTitle":"Add AI-classified columns with Jev","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/ai-columns-jev","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Add AI-classified columns with Jev · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers';\n\nregisterAllModules();\n\n// The columns to add. `type` is the Jev question type: noul (yes or no),\n// score (one of ordered levels), choice (one option from a list).\nconst AI_COLUMNS = [\n {\n key: 'sentiment',\n name: 'Sentiment',\n type: 'score',\n prompt: 'How positive is this review overall?',\n options: ['Very negative', 'Negative', 'Mixed', 'Positive', 'Very positive'],\n },\n {\n key: 'category',\n name: 'Category',\n type: 'choice',\n prompt: 'Which category best fits the main issue in this review?',\n options: ['quality', 'shipping', 'price', 'support', 'usability'],\n },\n {\n key: 'needsReply',\n name: 'Needs reply',\n type: 'noul',\n prompt: 'Does this review warrant a reply from customer support?',\n },\n];\n\n/* start:skip-in-preview */\nconst reviews = [\n {\n id: 1,\n product: 'Wireless earbuds',\n review:\n \"Crisp sound, the case charges fast, and they pair instantly with my laptop. Easily the best pair I've owned under $100.\",\n },\n {\n id: 2,\n product: 'Wireless earbuds',\n review:\n \"Left bud died after nine days. Support sent a replacement without fuss, but I shouldn't have needed one this soon.\",\n },\n {\n id: 3,\n product: 'Standing desk',\n review:\n \"Motor is whisper quiet and the frame doesn't wobble at full height. Assembly took 40 minutes with clear instructions.\",\n },\n {\n id: 4,\n product: 'Standing desk',\n review: 'Great desk but shipping took 3 weeks and support never replied to my two emails asking where it was.',\n },\n {\n id: 5,\n product: 'Coffee grinder',\n review: \"Grind is consistent from espresso to French press. It's loud, but every burr grinder is.\",\n },\n {\n id: 6,\n product: 'Coffee grinder',\n review: 'Stopped working after two months. The hopper lid also cracked. Expected more for $180.',\n },\n {\n id: 7,\n product: 'Running shoes',\n review:\n 'Light, breathable, and the fit is true to size. Ran a half marathon in them the second week with no blisters.',\n },\n {\n id: 8,\n product: 'Running shoes',\n review:\n 'Comfortable shoe, but the sole started separating at the toe after 60 miles. Returned it, refund took 3 weeks.',\n },\n {\n id: 14,\n product: 'Mechanical keyboard',\n review: \"Two keys arrived dead. Support fixed it fast with a replacement, so I'm happy now, but the QA worries me.\",\n },\n {\n id: 24,\n product: 'Electric kettle',\n review: 'The kettle is good. The box arrived crushed and the lid was dented. Kept it anyway because it works.',\n },\n];\n\n// Jev's answers for the rows above, recorded from the API on 2026-10-08.\n// Keyed \":\". Score probabilities are per level index.\nconst RECORDED = {\n 'sentiment:1': { type: 'score', score: 4.0, confidence: 1.0, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0, 4: 1 } },\n 'sentiment:2': {\n type: 'score',\n score: 1.66,\n confidence: 0.72,\n probabilities: { 0: 0, 1: 0.33, 2: 0.67, 3: 0, 4: 0 },\n },\n 'sentiment:3': {\n type: 'score',\n score: 3.95,\n confidence: 0.96,\n probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.04, 4: 0.96 },\n },\n 'sentiment:4': {\n type: 'score',\n score: 1.95,\n confidence: 0.96,\n probabilities: { 0: 0, 1: 0.05, 2: 0.95, 3: 0, 4: 0 },\n },\n 'sentiment:5': {\n type: 'score',\n score: 3.05,\n confidence: 0.95,\n probabilities: { 0: 0, 1: 0, 2: 0.01, 3: 0.93, 4: 0.06 },\n },\n 'sentiment:6': { type: 'score', score: 0.2, confidence: 0.83, probabilities: { 0: 0.8, 1: 0.2, 2: 0, 3: 0, 4: 0 } },\n 'sentiment:7': {\n type: 'score',\n score: 3.98,\n confidence: 0.98,\n probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.02, 4: 0.98 },\n },\n 'sentiment:8': {\n type: 'score',\n score: 1.21,\n confidence: 0.81,\n probabilities: { 0: 0.01, 1: 0.77, 2: 0.22, 3: 0, 4: 0 },\n },\n 'sentiment:14': {\n type: 'score',\n score: 2.04,\n confidence: 0.97,\n probabilities: { 0: 0, 1: 0, 2: 0.96, 3: 0.04, 4: 0 },\n },\n 'sentiment:24': {\n type: 'score',\n score: 2.06,\n confidence: 0.94,\n probabilities: { 0: 0, 1: 0.01, 2: 0.92, 3: 0.07, 4: 0 },\n },\n 'category:1': { type: 'choice', choice: 'quality', confidence: 0.52 },\n 'category:2': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:3': { type: 'choice', choice: 'quality', confidence: 0.79 },\n 'category:4': { type: 'choice', choice: 'shipping', confidence: 0.86 },\n 'category:5': { type: 'choice', choice: 'usability', confidence: 0.62 },\n 'category:6': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:7': { type: 'choice', choice: 'usability', confidence: 0.46 },\n 'category:8': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:14': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:24': { type: 'choice', choice: 'shipping', confidence: 0.99 },\n 'needsReply:1': { type: 'noul', noul: 0.12 },\n 'needsReply:2': { type: 'noul', noul: 0.7 },\n 'needsReply:3': { type: 'noul', noul: 0.12 },\n 'needsReply:4': { type: 'noul', noul: 0.9 },\n 'needsReply:5': { type: 'noul', noul: 0.12 },\n 'needsReply:6': { type: 'noul', noul: 0.88 },\n 'needsReply:7': { type: 'noul', noul: 0.12 },\n 'needsReply:8': { type: 'noul', noul: 0.79 },\n 'needsReply:14': { type: 'noul', noul: 0.65 },\n 'needsReply:24': { type: 'noul', noul: 0.69 },\n};\n/* end:skip-in-preview */\n\n// Stand-in for the model: a recorded answer after a short delay, so the page\n// needs no backend. For the real model, send `{ type, prompt, options, row }`\n// to a proxy that holds your key (see Step 5 on the page).\nfunction classify(row, column) {\n const answer = RECORDED[`${column.key}:${row.id}`];\n\n return new Promise((resolve, reject) => {\n setTimeout(\n () => {\n if (answer) {\n resolve(answer);\n } else {\n reject(new Error('No answer'));\n }\n },\n 150 + Math.random() * 250,\n );\n });\n}\n\n// Which of Jev's fields go into the cells. A Noul is a single probability and\n// has no confidence field, so a Noul column gets no confidence column.\nfunction toCells(column, answer) {\n switch (answer.type) {\n case 'noul':\n return { value: answer.noul };\n case 'score': {\n // The level with the highest probability; `probabilities` is keyed by level index.\n const [best] = Object.entries(answer.probabilities).sort(([, a], [, b]) => b - a)[0];\n\n return { value: column.options?.[Number(best)] ?? String(answer.score), confidence: answer.confidence };\n }\n case 'choice':\n return { value: answer.choice, confidence: answer.confidence };\n default:\n return { value: '' };\n }\n}\n\n// Per-cell state, keyed \":\" so it survives sorting.\nconst pending = new Set();\nconst failed = new Map();\n\nfunction cellKey(instance, visualRow, column) {\n const row = instance.getSourceDataAtRow(instance.toPhysicalRow(visualRow));\n\n return `${column.key}:${row.id}`;\n}\n\nconst valueRenderer = (column) => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? value.toFixed(2) : (value ?? '');\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-error', failed.has(key));\n\n if (failed.has(key)) {\n td.textContent = 'err';\n td.title = failed.get(key) ?? '';\n } else {\n td.removeAttribute('title');\n }\n};\n\nconst confidenceRenderer = (column) => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? `${Math.round(value * 100)}%` : '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-low', typeof value === 'number' && value < 0.6);\n td.classList.toggle('ai-high', typeof value === 'number' && value > 0.85);\n};\n\nconst rootContainer = document.querySelector('#example1');\n\n// Inject the controls row and the grid mount point inside #example1.\nrootContainer.innerHTML = `\n
    \n
    \n \n \n
    \n
    \n
    \n`;\n\nconst button = rootContainer.querySelector('.ai-classify');\nconst status = rootContainer.querySelector('.ai-status');\n\nconst columns = [\n { data: 'id', readOnly: true, width: 50, className: 'htRight' },\n { data: 'product', readOnly: true, width: 140 },\n { data: 'review', readOnly: true, width: 380 },\n];\nconst headers = ['ID', 'Product', 'Review'];\n\nconst hot = new Handsontable(rootContainer.querySelector('.ai-columns-grid'), {\n data: reviews,\n columns,\n colHeaders: headers,\n columnSorting: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Runs `worker` over `items` with at most `limit` in flight.\nasync function runPool(items, limit, worker) {\n let next = 0;\n\n const lanes = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const item = items[next];\n\n next += 1;\n await worker(item);\n }\n });\n\n await Promise.all(lanes);\n}\n\nbutton.addEventListener('click', async () => {\n button.disabled = true;\n\n // 1. Add a value column per definition, a confidence column where Jev\n // returns one, and mark every new cell as pending.\n AI_COLUMNS.forEach((column) => {\n columns.push({\n data: column.key,\n readOnly: true,\n renderer: valueRenderer(column),\n width: 130,\n className: column.type === 'noul' ? 'htRight' : '',\n });\n headers.push(column.name);\n\n if (column.type !== 'noul') {\n columns.push({\n data: `${column.key}Confidence`,\n readOnly: true,\n renderer: confidenceRenderer(column),\n width: 125,\n className: 'htRight',\n });\n headers.push(`${column.name} conf.`);\n }\n\n reviews.forEach((row) => pending.add(`${column.key}:${row.id}`));\n });\n hot.updateSettings({ columns: [...columns], colHeaders: [...headers] });\n\n // 2. One request per cell, a few at a time. Results are written by physical\n // row, so a sort applied mid-fill cannot misplace them.\n const jobs = AI_COLUMNS.flatMap((column) => reviews.map((row) => ({ column, row })));\n let done = 0;\n\n await runPool(jobs, 4, async ({ column, row }) => {\n const key = `${column.key}:${row.id}`;\n const physicalRow = reviews.indexOf(row);\n\n try {\n const cells = toCells(column, await classify(row, column));\n\n hot.setSourceDataAtCell(physicalRow, column.key, cells.value);\n\n if (cells.confidence !== undefined) {\n hot.setSourceDataAtCell(physicalRow, `${column.key}Confidence`, cells.confidence);\n }\n } catch (error) {\n failed.set(key, error instanceof Error ? error.message : 'Request failed');\n } finally {\n pending.delete(key);\n done += 1;\n status.textContent = `${done} of ${jobs.length} answers`;\n hot.render();\n }\n });\n\n status.textContent = `Classified ${reviews.length} reviews.`;\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Grid mount point below the controls row. */\n.ai-columns-grid {\n margin-top: 8px;\n}\n\n.ai-status {\n margin-left: 12px;\n font-size: 0.9em;\n opacity: 0.8;\n}\n\n/* A cell waiting for the model's answer. The theme paints read-only cells with its own\n background, so these rules use !important to win. */\n@keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.handsontable tbody td.ai-pending {\n background-image: linear-gradient(\n 90deg,\n rgba(59, 130, 246, 0.08) 25%,\n rgba(59, 130, 246, 0.3) 50%,\n rgba(59, 130, 246, 0.08) 75%\n ) !important;\n background-size: 200% 100% !important;\n animation: aiShimmer 1.1s linear infinite;\n}\n\n/* A row the model could not answer. The tooltip carries the reason. */\n.handsontable tbody td.ai-error {\n color: #c62828;\n font-weight: 600;\n}\n\n/* Confidence bands: below 60% and above 85%. Everything in between stays neutral. */\n.handsontable tbody td.ai-low {\n background-color: rgba(239, 68, 68, 0.22) !important;\n}\n\n.handsontable tbody td.ai-high {\n background-color: rgba(34, 197, 94, 0.22) !important;\n}"},"docsPath":"recipes/real-time/ai-columns-jev/javascript/example1.js","breadcrumb":["Recipes","Real Time","Add AI-classified columns with Jev"],"guide":"recipes/real-time/ai-columns-jev/ai-columns-jev.md","guideTitle":"Add AI-classified columns with Jev","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/ai-columns-jev","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.ts.json index c48209bd8..d0a65d0d3 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__ai-columns-jev__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Real Time ▸ Add AI-classified columns with Jev · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers';\nimport type { BaseRenderer } from 'handsontable/renderers';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\ntype Row = {\n id: number;\n product: string;\n review: string;\n [aiColumn: string]: string | number | null;\n};\n\ntype AiColumn = {\n key: string;\n name: string;\n type: 'noul' | 'score' | 'choice';\n prompt: string;\n options?: string[];\n};\n\n// Jev's answer shapes, as returned by the API (only the fields this example reads).\ntype JevAnswer =\n | { type: 'noul'; noul: number }\n | { type: 'score'; score: number; confidence: number; probabilities: Record }\n | { type: 'choice'; choice: string; confidence: number };\n\n// The columns to add. `type` is the Jev question type: noul (yes or no),\n// score (one of ordered levels), choice (one option from a list).\nconst AI_COLUMNS: AiColumn[] = [\n {\n key: 'sentiment',\n name: 'Sentiment',\n type: 'score',\n prompt: 'How positive is this review overall?',\n options: ['Very negative', 'Negative', 'Mixed', 'Positive', 'Very positive'],\n },\n {\n key: 'category',\n name: 'Category',\n type: 'choice',\n prompt: 'Which category best fits the main issue in this review?',\n options: ['quality', 'shipping', 'price', 'support', 'usability'],\n },\n {\n key: 'needsReply',\n name: 'Needs reply',\n type: 'noul',\n prompt: 'Does this review warrant a reply from customer support?',\n },\n];\n\n/* start:skip-in-preview */\nconst reviews: Row[] = [\n { id: 1, product: 'Wireless earbuds', review: \"Crisp sound, the case charges fast, and they pair instantly with my laptop. Easily the best pair I've owned under $100.\" },\n { id: 2, product: 'Wireless earbuds', review: \"Left bud died after nine days. Support sent a replacement without fuss, but I shouldn't have needed one this soon.\" },\n { id: 3, product: 'Standing desk', review: \"Motor is whisper quiet and the frame doesn't wobble at full height. Assembly took 40 minutes with clear instructions.\" },\n { id: 4, product: 'Standing desk', review: 'Great desk but shipping took 3 weeks and support never replied to my two emails asking where it was.' },\n { id: 5, product: 'Coffee grinder', review: \"Grind is consistent from espresso to French press. It's loud, but every burr grinder is.\" },\n { id: 6, product: 'Coffee grinder', review: 'Stopped working after two months. The hopper lid also cracked. Expected more for $180.' },\n { id: 7, product: 'Running shoes', review: 'Light, breathable, and the fit is true to size. Ran a half marathon in them the second week with no blisters.' },\n { id: 8, product: 'Running shoes', review: 'Comfortable shoe, but the sole started separating at the toe after 60 miles. Returned it, refund took 3 weeks.' },\n { id: 14, product: 'Mechanical keyboard', review: \"Two keys arrived dead. Support fixed it fast with a replacement, so I'm happy now, but the QA worries me.\" },\n { id: 24, product: 'Electric kettle', review: 'The kettle is good. The box arrived crushed and the lid was dented. Kept it anyway because it works.' },\n];\n\n// Jev's answers for the rows above, recorded from the API on 2026-10-08.\n// Keyed \":\". Score probabilities are per level index.\nconst RECORDED: Record = {\n 'sentiment:1': { type: 'score', score: 4.0, confidence: 1.0, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0, 4: 1 } },\n 'sentiment:2': { type: 'score', score: 1.66, confidence: 0.72, probabilities: { 0: 0, 1: 0.33, 2: 0.67, 3: 0, 4: 0 } },\n 'sentiment:3': { type: 'score', score: 3.95, confidence: 0.96, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.04, 4: 0.96 } },\n 'sentiment:4': { type: 'score', score: 1.95, confidence: 0.96, probabilities: { 0: 0, 1: 0.05, 2: 0.95, 3: 0, 4: 0 } },\n 'sentiment:5': { type: 'score', score: 3.05, confidence: 0.95, probabilities: { 0: 0, 1: 0, 2: 0.01, 3: 0.93, 4: 0.06 } },\n 'sentiment:6': { type: 'score', score: 0.2, confidence: 0.83, probabilities: { 0: 0.8, 1: 0.2, 2: 0, 3: 0, 4: 0 } },\n 'sentiment:7': { type: 'score', score: 3.98, confidence: 0.98, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.02, 4: 0.98 } },\n 'sentiment:8': { type: 'score', score: 1.21, confidence: 0.81, probabilities: { 0: 0.01, 1: 0.77, 2: 0.22, 3: 0, 4: 0 } },\n 'sentiment:14': { type: 'score', score: 2.04, confidence: 0.97, probabilities: { 0: 0, 1: 0, 2: 0.96, 3: 0.04, 4: 0 } },\n 'sentiment:24': { type: 'score', score: 2.06, confidence: 0.94, probabilities: { 0: 0, 1: 0.01, 2: 0.92, 3: 0.07, 4: 0 } },\n 'category:1': { type: 'choice', choice: 'quality', confidence: 0.52 },\n 'category:2': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:3': { type: 'choice', choice: 'quality', confidence: 0.79 },\n 'category:4': { type: 'choice', choice: 'shipping', confidence: 0.86 },\n 'category:5': { type: 'choice', choice: 'usability', confidence: 0.62 },\n 'category:6': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:7': { type: 'choice', choice: 'usability', confidence: 0.46 },\n 'category:8': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:14': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:24': { type: 'choice', choice: 'shipping', confidence: 0.99 },\n 'needsReply:1': { type: 'noul', noul: 0.12 },\n 'needsReply:2': { type: 'noul', noul: 0.7 },\n 'needsReply:3': { type: 'noul', noul: 0.12 },\n 'needsReply:4': { type: 'noul', noul: 0.9 },\n 'needsReply:5': { type: 'noul', noul: 0.12 },\n 'needsReply:6': { type: 'noul', noul: 0.88 },\n 'needsReply:7': { type: 'noul', noul: 0.12 },\n 'needsReply:8': { type: 'noul', noul: 0.79 },\n 'needsReply:14': { type: 'noul', noul: 0.65 },\n 'needsReply:24': { type: 'noul', noul: 0.69 },\n};\n/* end:skip-in-preview */\n\n// Stand-in for the model: a recorded answer after a short delay, so the page\n// needs no backend. For the real model, send `{ type, prompt, options, row }`\n// to a proxy that holds your key (see Step 5 on the page).\nfunction classify(row: Row, column: AiColumn): Promise {\n const answer = RECORDED[`${column.key}:${row.id}`];\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n if (answer) {\n resolve(answer);\n } else {\n reject(new Error('No answer'));\n }\n }, 150 + Math.random() * 250);\n });\n}\n\n// Which of Jev's fields go into the cells. A Noul is a single probability and\n// has no confidence field, so a Noul column gets no confidence column.\nfunction toCells(column: AiColumn, answer: JevAnswer): { value: string | number; confidence?: number } {\n switch (answer.type) {\n case 'noul':\n return { value: answer.noul };\n case 'score': {\n // The level with the highest probability; `probabilities` is keyed by level index.\n const [best] = Object.entries(answer.probabilities).sort(([, a], [, b]) => b - a)[0];\n\n return { value: column.options?.[Number(best)] ?? String(answer.score), confidence: answer.confidence };\n }\n case 'choice':\n return { value: answer.choice, confidence: answer.confidence };\n default:\n return { value: '' };\n }\n}\n\n// Per-cell state, keyed \":\" so it survives sorting.\nconst pending = new Set();\nconst failed = new Map();\n\nfunction cellKey(instance: Handsontable, visualRow: number, column: AiColumn): string {\n const row = instance.getSourceDataAtRow(instance.toPhysicalRow(visualRow)) as Row;\n\n return `${column.key}:${row.id}`;\n}\n\nconst valueRenderer = (column: AiColumn): BaseRenderer => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? value.toFixed(2) : value ?? '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-error', failed.has(key));\n\n if (failed.has(key)) {\n td.textContent = 'err';\n td.title = failed.get(key) ?? '';\n } else {\n td.removeAttribute('title');\n }\n};\n\nconst confidenceRenderer = (column: AiColumn): BaseRenderer => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? `${Math.round(value * 100)}%` : '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-low', typeof value === 'number' && value < 0.6);\n td.classList.toggle('ai-high', typeof value === 'number' && value > 0.85);\n};\n\nconst rootContainer = document.querySelector('#example1')!;\n\n// Inject the controls row and the grid mount point inside #example1.\nrootContainer.innerHTML = `\n
    \n
    \n \n \n
    \n
    \n
    \n`;\n\nconst button = rootContainer.querySelector('.ai-classify')!;\nconst status = rootContainer.querySelector('.ai-status')!;\n\nconst columns: ColumnSettings[] = [\n { data: 'id', readOnly: true, width: 50, className: 'htRight' },\n { data: 'product', readOnly: true, width: 140 },\n { data: 'review', readOnly: true, width: 380 },\n];\nconst headers = ['ID', 'Product', 'Review'];\n\nconst hot = new Handsontable(rootContainer.querySelector('.ai-columns-grid')!, {\n data: reviews,\n columns,\n colHeaders: headers,\n columnSorting: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Runs `worker` over `items` with at most `limit` in flight.\nasync function runPool(items: T[], limit: number, worker: (item: T) => Promise): Promise {\n let next = 0;\n\n const lanes = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const item = items[next];\n\n next += 1;\n await worker(item);\n }\n });\n\n await Promise.all(lanes);\n}\n\nbutton.addEventListener('click', async () => {\n button.disabled = true;\n\n // 1. Add a value column per definition, a confidence column where Jev\n // returns one, and mark every new cell as pending.\n AI_COLUMNS.forEach((column) => {\n columns.push({\n data: column.key,\n readOnly: true,\n renderer: valueRenderer(column),\n width: 130,\n className: column.type === 'noul' ? 'htRight' : '',\n });\n headers.push(column.name);\n\n if (column.type !== 'noul') {\n columns.push({\n data: `${column.key}Confidence`,\n readOnly: true,\n renderer: confidenceRenderer(column),\n width: 125,\n className: 'htRight',\n });\n headers.push(`${column.name} conf.`);\n }\n\n reviews.forEach((row) => pending.add(`${column.key}:${row.id}`));\n });\n hot.updateSettings({ columns: [...columns], colHeaders: [...headers] });\n\n // 2. One request per cell, a few at a time. Results are written by physical\n // row, so a sort applied mid-fill cannot misplace them.\n const jobs = AI_COLUMNS.flatMap((column) => reviews.map((row) => ({ column, row })));\n let done = 0;\n\n await runPool(jobs, 4, async ({ column, row }) => {\n const key = `${column.key}:${row.id}`;\n const physicalRow = reviews.indexOf(row);\n\n try {\n const cells = toCells(column, await classify(row, column));\n\n hot.setSourceDataAtCell(physicalRow, column.key, cells.value);\n\n if (cells.confidence !== undefined) {\n hot.setSourceDataAtCell(physicalRow, `${column.key}Confidence`, cells.confidence);\n }\n } catch (error) {\n failed.set(key, error instanceof Error ? error.message : 'Request failed');\n } finally {\n pending.delete(key);\n done += 1;\n status.textContent = `${done} of ${jobs.length} answers`;\n hot.render();\n }\n });\n\n status.textContent = `Classified ${reviews.length} reviews.`;\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Grid mount point below the controls row. */\n.ai-columns-grid {\n margin-top: 8px;\n}\n\n.ai-status {\n margin-left: 12px;\n font-size: 0.9em;\n opacity: 0.8;\n}\n\n/* A cell waiting for the model's answer. The theme paints read-only cells with its own\n background, so these rules use !important to win. */\n@keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.handsontable tbody td.ai-pending {\n background-image: linear-gradient(\n 90deg,\n rgba(59, 130, 246, 0.08) 25%,\n rgba(59, 130, 246, 0.3) 50%,\n rgba(59, 130, 246, 0.08) 75%\n ) !important;\n background-size: 200% 100% !important;\n animation: aiShimmer 1.1s linear infinite;\n}\n\n/* A row the model could not answer. The tooltip carries the reason. */\n.handsontable tbody td.ai-error {\n color: #c62828;\n font-weight: 600;\n}\n\n/* Confidence bands: below 60% and above 85%. Everything in between stays neutral. */\n.handsontable tbody td.ai-low {\n background-color: rgba(239, 68, 68, 0.22) !important;\n}\n\n.handsontable tbody td.ai-high {\n background-color: rgba(34, 197, 94, 0.22) !important;\n}"},"docsPath":"recipes/real-time/ai-columns-jev/javascript/example1.ts","breadcrumb":["Recipes","Real Time","Add AI-classified columns with Jev"],"guide":"recipes/real-time/ai-columns-jev/ai-columns-jev.md","guideTitle":"Add AI-classified columns with Jev","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/ai-columns-jev","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Real Time ▸ Add AI-classified columns with Jev · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { textRenderer } from 'handsontable/renderers';\nimport type { BaseRenderer } from 'handsontable/renderers';\nimport type { ColumnSettings } from 'handsontable/settings';\n\nregisterAllModules();\n\ntype Row = {\n id: number;\n product: string;\n review: string;\n [aiColumn: string]: string | number | null;\n};\n\ntype AiColumn = {\n key: string;\n name: string;\n type: 'noul' | 'score' | 'choice';\n prompt: string;\n options?: string[];\n};\n\n// Jev's answer shapes, as returned by the API (only the fields this example reads).\ntype JevAnswer =\n | { type: 'noul'; noul: number }\n | { type: 'score'; score: number; confidence: number; probabilities: Record }\n | { type: 'choice'; choice: string; confidence: number };\n\n// The columns to add. `type` is the Jev question type: noul (yes or no),\n// score (one of ordered levels), choice (one option from a list).\nconst AI_COLUMNS: AiColumn[] = [\n {\n key: 'sentiment',\n name: 'Sentiment',\n type: 'score',\n prompt: 'How positive is this review overall?',\n options: ['Very negative', 'Negative', 'Mixed', 'Positive', 'Very positive'],\n },\n {\n key: 'category',\n name: 'Category',\n type: 'choice',\n prompt: 'Which category best fits the main issue in this review?',\n options: ['quality', 'shipping', 'price', 'support', 'usability'],\n },\n {\n key: 'needsReply',\n name: 'Needs reply',\n type: 'noul',\n prompt: 'Does this review warrant a reply from customer support?',\n },\n];\n\n/* start:skip-in-preview */\nconst reviews: Row[] = [\n { id: 1, product: 'Wireless earbuds', review: \"Crisp sound, the case charges fast, and they pair instantly with my laptop. Easily the best pair I've owned under $100.\" },\n { id: 2, product: 'Wireless earbuds', review: \"Left bud died after nine days. Support sent a replacement without fuss, but I shouldn't have needed one this soon.\" },\n { id: 3, product: 'Standing desk', review: \"Motor is whisper quiet and the frame doesn't wobble at full height. Assembly took 40 minutes with clear instructions.\" },\n { id: 4, product: 'Standing desk', review: 'Great desk but shipping took 3 weeks and support never replied to my two emails asking where it was.' },\n { id: 5, product: 'Coffee grinder', review: \"Grind is consistent from espresso to French press. It's loud, but every burr grinder is.\" },\n { id: 6, product: 'Coffee grinder', review: 'Stopped working after two months. The hopper lid also cracked. Expected more for $180.' },\n { id: 7, product: 'Running shoes', review: 'Light, breathable, and the fit is true to size. Ran a half marathon in them the second week with no blisters.' },\n { id: 8, product: 'Running shoes', review: 'Comfortable shoe, but the sole started separating at the toe after 60 miles. Returned it, refund took 3 weeks.' },\n { id: 14, product: 'Mechanical keyboard', review: \"Two keys arrived dead. Support fixed it fast with a replacement, so I'm happy now, but the QA worries me.\" },\n { id: 24, product: 'Electric kettle', review: 'The kettle is good. The box arrived crushed and the lid was dented. Kept it anyway because it works.' },\n];\n\n// Jev's answers for the rows above, recorded from the API on 2026-10-08.\n// Keyed \":\". Score probabilities are per level index.\nconst RECORDED: Record = {\n 'sentiment:1': { type: 'score', score: 4.0, confidence: 1.0, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0, 4: 1 } },\n 'sentiment:2': { type: 'score', score: 1.66, confidence: 0.72, probabilities: { 0: 0, 1: 0.33, 2: 0.67, 3: 0, 4: 0 } },\n 'sentiment:3': { type: 'score', score: 3.95, confidence: 0.96, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.04, 4: 0.96 } },\n 'sentiment:4': { type: 'score', score: 1.95, confidence: 0.96, probabilities: { 0: 0, 1: 0.05, 2: 0.95, 3: 0, 4: 0 } },\n 'sentiment:5': { type: 'score', score: 3.05, confidence: 0.95, probabilities: { 0: 0, 1: 0, 2: 0.01, 3: 0.93, 4: 0.06 } },\n 'sentiment:6': { type: 'score', score: 0.2, confidence: 0.83, probabilities: { 0: 0.8, 1: 0.2, 2: 0, 3: 0, 4: 0 } },\n 'sentiment:7': { type: 'score', score: 3.98, confidence: 0.98, probabilities: { 0: 0, 1: 0, 2: 0, 3: 0.02, 4: 0.98 } },\n 'sentiment:8': { type: 'score', score: 1.21, confidence: 0.81, probabilities: { 0: 0.01, 1: 0.77, 2: 0.22, 3: 0, 4: 0 } },\n 'sentiment:14': { type: 'score', score: 2.04, confidence: 0.97, probabilities: { 0: 0, 1: 0, 2: 0.96, 3: 0.04, 4: 0 } },\n 'sentiment:24': { type: 'score', score: 2.06, confidence: 0.94, probabilities: { 0: 0, 1: 0.01, 2: 0.92, 3: 0.07, 4: 0 } },\n 'category:1': { type: 'choice', choice: 'quality', confidence: 0.52 },\n 'category:2': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:3': { type: 'choice', choice: 'quality', confidence: 0.79 },\n 'category:4': { type: 'choice', choice: 'shipping', confidence: 0.86 },\n 'category:5': { type: 'choice', choice: 'usability', confidence: 0.62 },\n 'category:6': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:7': { type: 'choice', choice: 'usability', confidence: 0.46 },\n 'category:8': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:14': { type: 'choice', choice: 'quality', confidence: 1.0 },\n 'category:24': { type: 'choice', choice: 'shipping', confidence: 0.99 },\n 'needsReply:1': { type: 'noul', noul: 0.12 },\n 'needsReply:2': { type: 'noul', noul: 0.7 },\n 'needsReply:3': { type: 'noul', noul: 0.12 },\n 'needsReply:4': { type: 'noul', noul: 0.9 },\n 'needsReply:5': { type: 'noul', noul: 0.12 },\n 'needsReply:6': { type: 'noul', noul: 0.88 },\n 'needsReply:7': { type: 'noul', noul: 0.12 },\n 'needsReply:8': { type: 'noul', noul: 0.79 },\n 'needsReply:14': { type: 'noul', noul: 0.65 },\n 'needsReply:24': { type: 'noul', noul: 0.69 },\n};\n/* end:skip-in-preview */\n\n// Stand-in for the model: a recorded answer after a short delay, so the page\n// needs no backend. For the real model, send `{ type, prompt, options, row }`\n// to a proxy that holds your key (see Step 5 on the page).\nfunction classify(row: Row, column: AiColumn): Promise {\n const answer = RECORDED[`${column.key}:${row.id}`];\n\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n if (answer) {\n resolve(answer);\n } else {\n reject(new Error('No answer'));\n }\n }, 150 + Math.random() * 250);\n });\n}\n\n// Which of Jev's fields go into the cells. A Noul is a single probability and\n// has no confidence field, so a Noul column gets no confidence column.\nfunction toCells(column: AiColumn, answer: JevAnswer): { value: string | number; confidence?: number } {\n switch (answer.type) {\n case 'noul':\n return { value: answer.noul };\n case 'score': {\n // The level with the highest probability; `probabilities` is keyed by level index.\n const [best] = Object.entries(answer.probabilities).sort(([, a], [, b]) => b - a)[0];\n\n return { value: column.options?.[Number(best)] ?? String(answer.score), confidence: answer.confidence };\n }\n case 'choice':\n return { value: answer.choice, confidence: answer.confidence };\n default:\n return { value: '' };\n }\n}\n\n// Per-cell state, keyed \":\" so it survives sorting.\nconst pending = new Set();\nconst failed = new Map();\n\nfunction cellKey(instance: Handsontable, visualRow: number, column: AiColumn): string {\n const row = instance.getSourceDataAtRow(instance.toPhysicalRow(visualRow)) as Row;\n\n return `${column.key}:${row.id}`;\n}\n\nconst valueRenderer = (column: AiColumn): BaseRenderer => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? value.toFixed(2) : value ?? '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-error', failed.has(key));\n\n if (failed.has(key)) {\n td.textContent = 'err';\n td.title = failed.get(key) ?? '';\n } else {\n td.removeAttribute('title');\n }\n};\n\nconst confidenceRenderer = (column: AiColumn): BaseRenderer => (instance, td, row, col, prop, value, cellProperties) => {\n const text = typeof value === 'number' ? `${Math.round(value * 100)}%` : '';\n\n textRenderer(instance, td, row, col, prop, text, cellProperties);\n\n const key = cellKey(instance, row, column);\n\n td.classList.toggle('ai-pending', pending.has(key));\n td.classList.toggle('ai-low', typeof value === 'number' && value < 0.6);\n td.classList.toggle('ai-high', typeof value === 'number' && value > 0.85);\n};\n\nconst rootContainer = document.querySelector('#example1')!;\n\n// Inject the controls row and the grid mount point inside #example1.\nrootContainer.innerHTML = `\n
    \n
    \n \n \n
    \n
    \n
    \n`;\n\nconst button = rootContainer.querySelector('.ai-classify')!;\nconst status = rootContainer.querySelector('.ai-status')!;\n\nconst columns: ColumnSettings[] = [\n { data: 'id', readOnly: true, width: 50, className: 'htRight' },\n { data: 'product', readOnly: true, width: 140 },\n { data: 'review', readOnly: true, width: 380 },\n];\nconst headers = ['ID', 'Product', 'Review'];\n\nconst hot = new Handsontable(rootContainer.querySelector('.ai-columns-grid')!, {\n data: reviews,\n columns,\n colHeaders: headers,\n columnSorting: true,\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Runs `worker` over `items` with at most `limit` in flight.\nasync function runPool(items: T[], limit: number, worker: (item: T) => Promise): Promise {\n let next = 0;\n\n const lanes = Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const item = items[next];\n\n next += 1;\n await worker(item);\n }\n });\n\n await Promise.all(lanes);\n}\n\nbutton.addEventListener('click', async () => {\n button.disabled = true;\n\n // 1. Add a value column per definition, a confidence column where Jev\n // returns one, and mark every new cell as pending.\n AI_COLUMNS.forEach((column) => {\n columns.push({\n data: column.key,\n readOnly: true,\n renderer: valueRenderer(column),\n width: 130,\n className: column.type === 'noul' ? 'htRight' : '',\n });\n headers.push(column.name);\n\n if (column.type !== 'noul') {\n columns.push({\n data: `${column.key}Confidence`,\n readOnly: true,\n renderer: confidenceRenderer(column),\n width: 125,\n className: 'htRight',\n });\n headers.push(`${column.name} conf.`);\n }\n\n reviews.forEach((row) => pending.add(`${column.key}:${row.id}`));\n });\n hot.updateSettings({ columns: [...columns], colHeaders: [...headers] });\n\n // 2. One request per cell, a few at a time. Results are written by physical\n // row, so a sort applied mid-fill cannot misplace them.\n const jobs = AI_COLUMNS.flatMap((column) => reviews.map((row) => ({ column, row })));\n let done = 0;\n\n await runPool(jobs, 4, async ({ column, row }) => {\n const key = `${column.key}:${row.id}`;\n const physicalRow = reviews.indexOf(row);\n\n try {\n const cells = toCells(column, await classify(row, column));\n\n hot.setSourceDataAtCell(physicalRow, column.key, cells.value);\n\n if (cells.confidence !== undefined) {\n hot.setSourceDataAtCell(physicalRow, `${column.key}Confidence`, cells.confidence);\n }\n } catch (error) {\n failed.set(key, error instanceof Error ? error.message : 'Request failed');\n } finally {\n pending.delete(key);\n done += 1;\n status.textContent = `${done} of ${jobs.length} answers`;\n hot.render();\n }\n });\n\n status.textContent = `Classified ${reviews.length} reviews.`;\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Grid mount point below the controls row. */\n.ai-columns-grid {\n margin-top: 8px;\n}\n\n.ai-status {\n margin-left: 12px;\n font-size: 0.9em;\n opacity: 0.8;\n}\n\n/* A cell waiting for the model's answer. The theme paints read-only cells with its own\n background, so these rules use !important to win. */\n@keyframes aiShimmer {\n from {\n background-position: 200% 0;\n }\n\n to {\n background-position: -200% 0;\n }\n}\n\n.handsontable tbody td.ai-pending {\n background-image: linear-gradient(\n 90deg,\n rgba(59, 130, 246, 0.08) 25%,\n rgba(59, 130, 246, 0.3) 50%,\n rgba(59, 130, 246, 0.08) 75%\n ) !important;\n background-size: 200% 100% !important;\n animation: aiShimmer 1.1s linear infinite;\n}\n\n/* A row the model could not answer. The tooltip carries the reason. */\n.handsontable tbody td.ai-error {\n color: #c62828;\n font-weight: 600;\n}\n\n/* Confidence bands: below 60% and above 85%. Everything in between stays neutral. */\n.handsontable tbody td.ai-low {\n background-color: rgba(239, 68, 68, 0.22) !important;\n}\n\n.handsontable tbody td.ai-high {\n background-color: rgba(34, 197, 94, 0.22) !important;\n}"},"docsPath":"recipes/real-time/ai-columns-jev/javascript/example1.ts","breadcrumb":["Recipes","Real Time","Add AI-classified columns with Jev"],"guide":"recipes/real-time/ai-columns-jev/ai-columns-jev.md","guideTitle":"Add AI-classified columns with Jev","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/ai-columns-jev","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__angular__example1.ts.json index 34e725225..b8fe0a87e 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"chart.js\": \"4.6.1\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\n\nChart.register(...registerables);\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-chartjs-sync',\n styles: [`\n #chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n }\n `],\n template: `\n \n \n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('chartCanvas') readonly canvasRef!: ElementRef;\n\n readonly data = data;\n\n private chart: Chart<'bar'> | null = null;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd: () => {\n this.updateChart();\n },\n afterDeselect: () => {\n this.updateChart();\n },\n licenseKey: 'non-commercial-and-evaluation',\n };\n\n ngAfterViewInit(): void {\n const config: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n };\n\n this.chart = new Chart(this.canvasRef.nativeElement, config);\n }\n\n ngOnDestroy(): void {\n this.chart?.destroy();\n }\n\n private updateChart(): void {\n const hot = this.hotTable?.hotInstance;\n const chart = this.chart;\n\n if (!hot || !chart) {\n return;\n }\n\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/real-time/chartjs-sync/angular/example1.ts","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\",\n \"chart.js\": \"4.6.1\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, ViewChild, ElementRef, AfterViewInit, OnDestroy } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\n\nChart.register(...registerables);\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-chartjs-sync',\n styles: [`\n #chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n }\n `],\n template: `\n \n \n `,\n})\nexport class AppComponent implements AfterViewInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n @ViewChild('chartCanvas') readonly canvasRef!: ElementRef;\n\n readonly data = data;\n\n private chart: Chart<'bar'> | null = null;\n\n readonly gridSettings: GridSettings = {\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd: () => {\n this.updateChart();\n },\n afterDeselect: () => {\n this.updateChart();\n },\n licenseKey: 'non-commercial-and-evaluation',\n };\n\n ngAfterViewInit(): void {\n const config: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n };\n\n this.chart = new Chart(this.canvasRef.nativeElement, config);\n }\n\n ngOnDestroy(): void {\n this.chart?.destroy();\n }\n\n private updateChart(): void {\n const hot = this.hotTable?.hotInstance;\n const chart = this.chart;\n\n if (!hot || !chart) {\n return;\n }\n\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/real-time/chartjs-sync/angular/example1.ts","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.js.json index 8c3919ad9..9512e888b 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Chart, registerables } from 'chart.js';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\nconst canvas = document.querySelector('#chart-canvas');\n\nconst chart = new Chart(canvas, {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${value.toLocaleString()}`,\n },\n },\n },\n },\n});\n\nfunction updateChart(hot) {\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels = [];\n const q1Values = [];\n const q2Values = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0]);\n q1Values.push(rowData[2]);\n q2Values.push(rowData[4]);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n}\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd() {\n updateChart(this);\n },\n afterDeselect() {\n updateChart(this);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/javascript/example1.js","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Chart, registerables } from 'chart.js';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\nconst data = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\nconst canvas = document.querySelector('#chart-canvas');\n\nconst chart = new Chart(canvas, {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${value.toLocaleString()}`,\n },\n },\n },\n },\n});\n\nfunction updateChart(hot) {\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels = [];\n const q1Values = [];\n const q2Values = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0]);\n q1Values.push(rowData[2]);\n q2Values.push(rowData[4]);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n}\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd() {\n updateChart(this);\n },\n afterDeselect() {\n updateChart(this);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/javascript/example1.js","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.ts.json index f114ebd67..0e36c2cfd 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\ninterface CampaignRow {\n campaign: string;\n q1Budget: number;\n q1Revenue: number;\n q2Budget: number;\n q2Revenue: number;\n}\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\nconst canvas = document.querySelector('#chart-canvas')!;\n\nconst chartConfig: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n};\n\nconst chart = new Chart(canvas, chartConfig);\n\nfunction updateChart(hot: Handsontable): void {\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n}\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd() {\n updateChart(this);\n },\n afterDeselect() {\n updateChart(this);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/javascript/example1.ts","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\ninterface CampaignRow {\n campaign: string;\n q1Budget: number;\n q1Revenue: number;\n q2Budget: number;\n q2Revenue: number;\n}\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\nconst canvas = document.querySelector('#chart-canvas')!;\n\nconst chartConfig: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n};\n\nconst chart = new Chart(canvas, chartConfig);\n\nfunction updateChart(hot: Handsontable): void {\n const selected = hot.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = hot.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n}\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, {\n data,\n colHeaders: ['Campaign', 'Q1 Budget ($)', 'Q1 Revenue ($)', 'Q2 Budget ($)', 'Q2 Revenue ($)'],\n columns: [\n { data: 'campaign', type: 'text', width: 200 },\n { data: 'q1Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q1Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Budget', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n { data: 'q2Revenue', type: 'numeric', numericFormat: { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }, width: 120 },\n ],\n rowHeaders: true,\n selectionMode: 'range',\n height: 'auto',\n width: '100%',\n autoWrapRow: true,\n afterSelectionEnd() {\n updateChart(this);\n },\n afterDeselect() {\n updateChart(this);\n },\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/javascript/example1.ts","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__react__example1.tsx.json index 624912564..0b547ebd5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__chartjs-sync__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect, useCallback } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\nimport './example1.css';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\ninterface CampaignRow {\n campaign: string;\n q1Budget: number;\n q1Revenue: number;\n q2Budget: number;\n q2Revenue: number;\n}\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst chartConfig: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n};\n\nconst ExampleComponent = () => {\n const canvasRef = useRef(null);\n const chartRef = useRef | null>(null);\n\n useEffect(() => {\n const chart = new Chart(canvasRef.current!, chartConfig);\n\n chartRef.current = chart;\n\n return () => chart.destroy();\n }, []);\n\n const updateChart = useCallback(function (this: Handsontable) {\n const chart = chartRef.current;\n\n if (!chart) {\n return;\n }\n\n const selected = this.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = this.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n }, []);\n\n return (\n <>\n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/react/example1.tsx","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Real Time ▸ Sync rows to a Chart.js chart · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\",\n \"chart.js\": \"4.6.1\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useRef, useEffect, useCallback } from 'react';\nimport { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport { Chart, registerables, ChartConfiguration } from 'chart.js';\nimport './example1.css';\n\nregisterAllModules();\nChart.register(...registerables);\n\n/* start:skip-in-preview */\ninterface CampaignRow {\n campaign: string;\n q1Budget: number;\n q1Revenue: number;\n q2Budget: number;\n q2Revenue: number;\n}\n\nconst data: CampaignRow[] = [\n { campaign: 'Spring Sale 2025', q1Budget: 12000, q1Revenue: 34500, q2Budget: 15000, q2Revenue: 41200 },\n { campaign: 'Brand Awareness Q1', q1Budget: 8000, q1Revenue: 11300, q2Budget: 9500, q2Revenue: 13800 },\n { campaign: 'Summer Promo', q1Budget: 5000, q1Revenue: 6200, q2Budget: 18000, q2Revenue: 52400 },\n { campaign: 'Email Retargeting', q1Budget: 3500, q1Revenue: 9800, q2Budget: 4200, q2Revenue: 11600 },\n { campaign: 'Influencer Campaign', q1Budget: 20000, q1Revenue: 38700, q2Budget: 22000, q2Revenue: 44100 },\n { campaign: 'SEO Push Q2', q1Budget: 6000, q1Revenue: 7400, q2Budget: 9000, q2Revenue: 21300 },\n { campaign: 'Holiday Countdown', q1Budget: 4500, q1Revenue: 5100, q2Budget: 25000, q2Revenue: 68900 },\n { campaign: 'Brand Awareness Q3', q1Budget: 11000, q1Revenue: 16800, q2Budget: 13500, q2Revenue: 19400 },\n];\n/* end:skip-in-preview */\n\nconst chartConfig: ChartConfiguration<'bar'> = {\n type: 'bar',\n data: {\n labels: ['Select rows above to compare campaigns'],\n datasets: [\n {\n label: 'Q1 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(54, 162, 235, 0.7)',\n borderColor: 'rgba(54, 162, 235, 1)',\n borderWidth: 1,\n },\n {\n label: 'Q2 Revenue ($)',\n data: [0],\n backgroundColor: 'rgba(255, 99, 132, 0.7)',\n borderColor: 'rgba(255, 99, 132, 1)',\n borderWidth: 1,\n },\n ],\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: { position: 'top' },\n title: { display: true, text: 'Campaign Revenue Comparison' },\n },\n scales: {\n y: {\n beginAtZero: true,\n ticks: {\n callback: (value) => `$${Number(value).toLocaleString()}`,\n },\n },\n },\n },\n};\n\nconst ExampleComponent = () => {\n const canvasRef = useRef(null);\n const chartRef = useRef | null>(null);\n\n useEffect(() => {\n const chart = new Chart(canvasRef.current!, chartConfig);\n\n chartRef.current = chart;\n\n return () => chart.destroy();\n }, []);\n\n const updateChart = useCallback(function (this: Handsontable) {\n const chart = chartRef.current;\n\n if (!chart) {\n return;\n }\n\n const selected = this.getSelected();\n\n if (!selected || selected.length === 0) {\n chart.data.labels = ['Select rows above to compare campaigns'];\n chart.data.datasets[0].data = [0];\n chart.data.datasets[1].data = [0];\n chart.update();\n\n return;\n }\n\n const rowSet = new Set();\n\n for (const [r1, , r2] of selected) {\n const minRow = Math.min(r1, r2);\n const maxRow = Math.max(r1, r2);\n\n for (let row = minRow; row <= maxRow; row++) {\n rowSet.add(row);\n }\n }\n\n const rows = [...rowSet].sort((a, b) => a - b);\n const labels: string[] = [];\n const q1Values: number[] = [];\n const q2Values: number[] = [];\n\n for (const row of rows) {\n const rowData = this.getDataAtRow(row);\n\n labels.push(rowData[0] as string);\n q1Values.push(rowData[2] as number);\n q2Values.push(rowData[4] as number);\n }\n\n chart.data.labels = labels;\n chart.data.datasets[0].data = q1Values;\n chart.data.datasets[1].data = q2Values;\n chart.update();\n }, []);\n\n return (\n <>\n \n \n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"#chart-canvas {\n max-height: 300px;\n margin-top: 16px;\n}"},"docsPath":"recipes/real-time/chartjs-sync/react/example1.tsx","breadcrumb":["Recipes","Real Time","Sync rows to a Chart.js chart"],"guide":"recipes/real-time/chartjs-sync/chartjs-sync.md","guideTitle":"Sync rows to a Chart.js chart","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/chartjs-sync","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__angular__example1.ts.json index 7f652dd92..4dc14d9f3 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ntype StockRow = {\n symbol: string;\n company: string;\n price: number;\n change: number;\n volume: number;\n marketCap: string;\n};\n\nconst STOCK_DATA: StockRow[] = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-websocket-updates',\n template: ``,\n})\nexport class AppComponent implements OnInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly hotData: StockRow[] = STOCK_DATA;\n\n private intervalId: ReturnType | null = null;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Symbol', 'Company', 'Price ($)', 'Change ($)', 'Volume', 'Market Cap'],\n columns: [\n { data: 'symbol', readOnly: true },\n { data: 'company', readOnly: true, width: 180 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'change', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'volume', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'marketCap', readOnly: true },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n stretchH: 'all',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if ((source as string) !== 'external' || !changes) {\n return;\n }\n\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([row]) => {\n [2, 3].forEach((col) => {\n const td = hot.getCell(row as number, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n });\n });\n },\n };\n\n ngOnInit(): void {\n this.intervalId = setInterval(() => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const row = Math.floor(Math.random() * STOCK_DATA.length);\n const basePrice = STOCK_DATA[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + STOCK_DATA[row].change).toFixed(2));\n\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n }, 1500);\n }\n\n ngOnDestroy(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/angular/example1.ts","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { GridSettings, HotTableComponent, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\ntype StockRow = {\n symbol: string;\n company: string;\n price: number;\n change: number;\n volume: number;\n marketCap: string;\n};\n\nconst STOCK_DATA: StockRow[] = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-websocket-updates',\n template: ``,\n})\nexport class AppComponent implements OnInit, OnDestroy {\n @ViewChild(HotTableComponent, { static: false }) readonly hotTable!: HotTableComponent;\n\n readonly hotData: StockRow[] = STOCK_DATA;\n\n private intervalId: ReturnType | null = null;\n\n readonly hotSettings: GridSettings = {\n colHeaders: ['Symbol', 'Company', 'Price ($)', 'Change ($)', 'Volume', 'Market Cap'],\n columns: [\n { data: 'symbol', readOnly: true },\n { data: 'company', readOnly: true, width: 180 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'change', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'volume', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'marketCap', readOnly: true },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n stretchH: 'all',\n afterChange: (changes: Handsontable.CellChange[] | null, source: Handsontable.ChangeSource) => {\n if ((source as string) !== 'external' || !changes) {\n return;\n }\n\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([row]) => {\n [2, 3].forEach((col) => {\n const td = hot.getCell(row as number, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n });\n });\n },\n };\n\n ngOnInit(): void {\n this.intervalId = setInterval(() => {\n const hot = this.hotTable?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const row = Math.floor(Math.random() * STOCK_DATA.length);\n const basePrice = STOCK_DATA[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + STOCK_DATA[row].change).toFixed(2));\n\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n }, 1500);\n }\n\n ngOnDestroy(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n }\n }\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/angular/example1.ts","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__javascript__example1.js.json index 40d3620fb..079a4400d 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst stockData = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: stockData,\n colHeaders: ['Symbol', 'Company', 'Price ($)', 'Change ($)', 'Volume', 'Market Cap'],\n columns: [\n { data: 'symbol', readOnly: true },\n { data: 'company', readOnly: true, width: 180 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'change', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'volume', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'marketCap', readOnly: true },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Flash a cell to draw attention when its value changes.\nhot.addHook('afterChange', (changes, source) => {\n if (source !== 'external' || !changes) {\n return;\n }\n\n changes.forEach(([row]) => {\n // Columns 2 (price) and 3 (change) are the ones updated by the simulation.\n [2, 3].forEach((col) => {\n const td = hot.getCell(row, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n // Trigger reflow so removing then adding the class restarts the animation.\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n });\n });\n});\n\n// Simulate a WebSocket feed with setInterval.\n// In production, replace this with a real WebSocket connection:\n// const ws = new WebSocket('wss://your-feed.example.com');\n// ws.onmessage = (event) => { const msg = JSON.parse(event.data); applyUpdate(msg); };\nconst intervalId = setInterval(() => {\n const row = Math.floor(Math.random() * stockData.length);\n const basePrice = stockData[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + stockData[row].change).toFixed(2));\n\n // Pass 'external' as the source so afterChange can distinguish this update\n // from direct user edits. This avoids triggering undo history for feed data.\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n}, 1500);\n\n// Clean up the interval when the user leaves the page to prevent stale updates.\nwindow.addEventListener('beforeunload', () => {\n clearInterval(intervalId);\n // If using a real WebSocket, close it here:\n // ws.close();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/javascript/example1.js","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\n/* start:skip-in-preview */\nconst stockData = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nconst hot = new Handsontable(container, {\n data: stockData,\n colHeaders: ['Symbol', 'Company', 'Price ($)', 'Change ($)', 'Volume', 'Market Cap'],\n columns: [\n { data: 'symbol', readOnly: true },\n { data: 'company', readOnly: true, width: 180 },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'change', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'volume', type: 'numeric', numericFormat: { useGrouping: true, maximumFractionDigits: 0 } },\n { data: 'marketCap', readOnly: true },\n ],\n rowHeaders: true,\n height: 'auto',\n width: '100%',\n stretchH: 'all',\n licenseKey: 'non-commercial-and-evaluation',\n});\n\n// Flash a cell to draw attention when its value changes.\nhot.addHook('afterChange', (changes, source) => {\n if (source !== 'external' || !changes) {\n return;\n }\n\n changes.forEach(([row]) => {\n // Columns 2 (price) and 3 (change) are the ones updated by the simulation.\n [2, 3].forEach((col) => {\n const td = hot.getCell(row, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n // Trigger reflow so removing then adding the class restarts the animation.\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n });\n });\n});\n\n// Simulate a WebSocket feed with setInterval.\n// In production, replace this with a real WebSocket connection:\n// const ws = new WebSocket('wss://your-feed.example.com');\n// ws.onmessage = (event) => { const msg = JSON.parse(event.data); applyUpdate(msg); };\nconst intervalId = setInterval(() => {\n const row = Math.floor(Math.random() * stockData.length);\n const basePrice = stockData[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + stockData[row].change).toFixed(2));\n\n // Pass 'external' as the source so afterChange can distinguish this update\n // from direct user edits. This avoids triggering undo history for feed data.\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n}, 1500);\n\n// Clean up the interval when the user leaves the page to prevent stale updates.\nwindow.addEventListener('beforeunload', () => {\n clearInterval(intervalId);\n // If using a real WebSocket, close it here:\n // ws.close();\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/javascript/example1.js","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__react__example1.tsx.json index 932c68a4d..c5a491dfb 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__real-time__websocket-updates__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype StockRow = {\n symbol: string;\n company: string;\n price: number;\n change: number;\n volume: number;\n marketCap: string;\n};\n\n/* start:skip-in-preview */\nconst stockData: StockRow[] = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n/* end:skip-in-preview */\n\nconst flashCell = (hot: Handsontable, row: number, col: number): void => {\n const td = hot.getCell(row, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const handleAfterChange = (\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void => {\n if (source !== 'external' || !changes) {\n return;\n }\n\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([row]) => {\n [2, 3].forEach((col) => flashCell(hot, row as number, col));\n });\n };\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const row = Math.floor(Math.random() * stockData.length);\n const basePrice = stockData[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + stockData[row].change).toFixed(2));\n\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n }, 1500);\n\n return () => clearInterval(intervalId);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/react/example1.tsx","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Real Time ▸ Real-time cell updates via WebSocket · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { useEffect, useRef } from 'react';\nimport { HotTable, HotTableRef } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype StockRow = {\n symbol: string;\n company: string;\n price: number;\n change: number;\n volume: number;\n marketCap: string;\n};\n\n/* start:skip-in-preview */\nconst stockData: StockRow[] = [\n { symbol: 'AAPL', company: 'Apple Inc.', price: 189.25, change: 1.45, volume: 52341200, marketCap: '2.94T' },\n { symbol: 'MSFT', company: 'Microsoft Corp.', price: 415.80, change: -0.72, volume: 18920400, marketCap: '3.08T' },\n { symbol: 'GOOG', company: 'Alphabet Inc.', price: 175.40, change: 2.13, volume: 21780000, marketCap: '2.19T' },\n { symbol: 'AMZN', company: 'Amazon.com Inc.', price: 198.60, change: -1.30, volume: 34560000, marketCap: '2.09T' },\n { symbol: 'NVDA', company: 'NVIDIA Corp.', price: 875.35, change: 14.20, volume: 41230000, marketCap: '2.15T' },\n { symbol: 'META', company: 'Meta Platforms Inc.', price: 512.90, change: 3.55, volume: 15670000, marketCap: '1.30T' },\n { symbol: 'TSLA', company: 'Tesla Inc.', price: 248.75, change: -5.60, volume: 98120000, marketCap: '793B' },\n { symbol: 'BRK', company: 'Berkshire Hathaway', price: 3890.00, change: 12.00, volume: 3450000, marketCap: '876B' },\n];\n/* end:skip-in-preview */\n\nconst flashCell = (hot: Handsontable, row: number, col: number): void => {\n const td = hot.getCell(row, col);\n\n if (td) {\n td.classList.remove('ht-cell-flash');\n void td.offsetWidth;\n td.classList.add('ht-cell-flash');\n td.addEventListener('animationend', () => td.classList.remove('ht-cell-flash'), { once: true });\n }\n};\n\nconst ExampleComponent = () => {\n const hotRef = useRef(null);\n\n const handleAfterChange = (\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource\n ): void => {\n if (source !== 'external' || !changes) {\n return;\n }\n\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n changes.forEach(([row]) => {\n [2, 3].forEach((col) => flashCell(hot, row as number, col));\n });\n };\n\n useEffect(() => {\n const intervalId = setInterval(() => {\n const hot = hotRef.current?.hotInstance;\n\n if (!hot) {\n return;\n }\n\n const row = Math.floor(Math.random() * stockData.length);\n const basePrice = stockData[row].price;\n const newPrice = parseFloat((basePrice + (Math.random() - 0.5) * 4).toFixed(2));\n const newChange = parseFloat((newPrice - basePrice + stockData[row].change).toFixed(2));\n\n hot.setDataAtRowProp(row, 'price', newPrice, 'external');\n hot.setDataAtRowProp(row, 'change', newChange, 'external');\n }, 1500);\n\n return () => clearInterval(intervalId);\n }, []);\n\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Flash animation applied to cells updated by an external data source (e.g., a WebSocket feed). */\n@keyframes cellFlash {\n 0% {\n background-color: rgba(255, 220, 0, 0.75);\n }\n\n 100% {\n background-color: transparent;\n }\n}\n\n.ht-cell-flash {\n animation: cellFlash 0.8s ease-out;\n}"},"docsPath":"recipes/real-time/websocket-updates/react/example1.tsx","breadcrumb":["Recipes","Real Time","Real-time cell updates via WebSocket"],"guide":"recipes/real-time/websocket-updates/websocket-updates.md","guideTitle":"Real-time cell updates via WebSocket","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/real-time/websocket-updates","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__angular__example1.ts.json index 7e68b621b..a4d4f3cd0 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport type { CellMeta, CellProperties } from 'handsontable/settings';\n\nconst STATUS_ROW_CLASSES: Record = {\n active: 'ht-demo-row-status-active',\n pending: 'ht-demo-row-status-pending',\n inactive: 'ht-demo-row-status-inactive',\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== 'string') {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-conditional-row-coloring',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = [\n { task: 'Invoice export', owner: 'A. Lee', status: 'active' },\n { task: 'SSO rollout', owner: 'M. Costa', status: 'pending' },\n { task: 'Legacy reports', owner: 'J. Park', status: 'inactive' },\n { task: 'API docs', owner: 'R. Singh', status: 'active' },\n { task: 'Mobile parity', owner: 'T. Nguyen', status: 'pending' },\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Task', 'Owner', 'Status'],\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'task', type: 'text', width: 220 },\n { data: 'owner', type: 'text', width: 120 },\n {\n data: 'status',\n type: 'dropdown',\n width: 120,\n source: ['active', 'pending', 'inactive'],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(\n this: CellProperties,\n row: number,\n _column: number,\n _prop: string | number,\n ): CellMeta {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n\n const status = hot.getDataAtRowProp(visualRow, 'status');\n const rowClass = statusToRowClass(status);\n\n if (!rowClass) {\n return {};\n }\n\n return { className: rowClass };\n },\n afterValidate(\n this: Handsontable,\n isValid: boolean,\n _value: Handsontable.CellValue,\n row: number,\n prop: string | number,\n ): void {\n if (isValid) {\n return;\n }\n\n const col = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n\n const td = this.getCell(row, col);\n\n if (!td) {\n return;\n }\n\n td.classList.add('ht-demo-invalid-flash');\n setTimeout(() => td.classList.remove('ht-demo-invalid-flash'), 800);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".handsontable td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n.handsontable td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n.handsontable td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n.handsontable td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\nimport type { CellMeta, CellProperties } from 'handsontable/settings';\n\nconst STATUS_ROW_CLASSES: Record = {\n active: 'ht-demo-row-status-active',\n pending: 'ht-demo-row-status-pending',\n inactive: 'ht-demo-row-status-inactive',\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== 'string') {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-conditional-row-coloring',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = [\n { task: 'Invoice export', owner: 'A. Lee', status: 'active' },\n { task: 'SSO rollout', owner: 'M. Costa', status: 'pending' },\n { task: 'Legacy reports', owner: 'J. Park', status: 'inactive' },\n { task: 'API docs', owner: 'R. Singh', status: 'active' },\n { task: 'Mobile parity', owner: 'T. Nguyen', status: 'pending' },\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Task', 'Owner', 'Status'],\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'task', type: 'text', width: 220 },\n { data: 'owner', type: 'text', width: 120 },\n {\n data: 'status',\n type: 'dropdown',\n width: 120,\n source: ['active', 'pending', 'inactive'],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(\n this: CellProperties,\n row: number,\n _column: number,\n _prop: string | number,\n ): CellMeta {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n\n const status = hot.getDataAtRowProp(visualRow, 'status');\n const rowClass = statusToRowClass(status);\n\n if (!rowClass) {\n return {};\n }\n\n return { className: rowClass };\n },\n afterValidate(\n this: Handsontable,\n isValid: boolean,\n _value: Handsontable.CellValue,\n row: number,\n prop: string | number,\n ): void {\n if (isValid) {\n return;\n }\n\n const col = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n\n const td = this.getCell(row, col);\n\n if (!td) {\n return;\n }\n\n td.classList.add('ht-demo-invalid-flash');\n setTimeout(() => td.classList.remove('ht-demo-invalid-flash'), 800);\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".handsontable td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n.handsontable td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n.handsontable td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n.handsontable td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.js.json index 3f5494569..82be9caa5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst STATUS_ROW_CLASSES = {\n active: \"ht-demo-row-status-active\",\n pending: \"ht-demo-row-status-pending\",\n inactive: \"ht-demo-row-status-inactive\",\n};\nfunction statusToRowClass(status) {\n if (typeof status !== \"string\") {\n return undefined;\n }\n return STATUS_ROW_CLASSES[status];\n}\n/* start:skip-in-preview */\nconst data = [\n { task: \"Invoice export\", owner: \"A. Lee\", status: \"active\" },\n { task: \"SSO rollout\", owner: \"M. Costa\", status: \"pending\" },\n { task: \"Legacy reports\", owner: \"J. Park\", status: \"inactive\" },\n { task: \"API docs\", owner: \"R. Singh\", status: \"active\" },\n { task: \"Mobile parity\", owner: \"T. Nguyen\", status: \"pending\" },\n];\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\nconst hotOptions = {\n data,\n licenseKey: \"non-commercial-and-evaluation\",\n rowHeaders: true,\n colHeaders: [\"Task\", \"Owner\", \"Status\"],\n height: \"auto\",\n width: \"100%\",\n columns: [\n { data: \"task\", type: \"text\", width: 220 },\n { data: \"owner\", type: \"text\", width: 120 },\n {\n data: \"status\",\n type: \"dropdown\",\n width: 120,\n source: [\"active\", \"pending\", \"inactive\"],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(row, _column, _prop) {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n const status = hot.getDataAtRowProp(visualRow, \"status\");\n const rowClass = statusToRowClass(status);\n if (!rowClass) {\n return {};\n }\n return { className: rowClass };\n },\n afterValidate(isValid, _value, row, prop) {\n if (isValid) {\n return;\n }\n const col = this.propToCol(prop);\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n const td = this.getCell(row, col);\n if (!td) {\n return;\n }\n td.classList.add(\"ht-demo-invalid-flash\");\n setTimeout(() => td.classList.remove(\"ht-demo-invalid-flash\"), 800);\n },\n};\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nregisterAllModules();\nconst STATUS_ROW_CLASSES = {\n active: \"ht-demo-row-status-active\",\n pending: \"ht-demo-row-status-pending\",\n inactive: \"ht-demo-row-status-inactive\",\n};\nfunction statusToRowClass(status) {\n if (typeof status !== \"string\") {\n return undefined;\n }\n return STATUS_ROW_CLASSES[status];\n}\n/* start:skip-in-preview */\nconst data = [\n { task: \"Invoice export\", owner: \"A. Lee\", status: \"active\" },\n { task: \"SSO rollout\", owner: \"M. Costa\", status: \"pending\" },\n { task: \"Legacy reports\", owner: \"J. Park\", status: \"inactive\" },\n { task: \"API docs\", owner: \"R. Singh\", status: \"active\" },\n { task: \"Mobile parity\", owner: \"T. Nguyen\", status: \"pending\" },\n];\n/* end:skip-in-preview */\nconst container = document.querySelector(\"#example1\");\nconst hotOptions = {\n data,\n licenseKey: \"non-commercial-and-evaluation\",\n rowHeaders: true,\n colHeaders: [\"Task\", \"Owner\", \"Status\"],\n height: \"auto\",\n width: \"100%\",\n columns: [\n { data: \"task\", type: \"text\", width: 220 },\n { data: \"owner\", type: \"text\", width: 120 },\n {\n data: \"status\",\n type: \"dropdown\",\n width: 120,\n source: [\"active\", \"pending\", \"inactive\"],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(row, _column, _prop) {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n const status = hot.getDataAtRowProp(visualRow, \"status\");\n const rowClass = statusToRowClass(status);\n if (!rowClass) {\n return {};\n }\n return { className: rowClass };\n },\n afterValidate(isValid, _value, row, prop) {\n if (isValid) {\n return;\n }\n const col = this.propToCol(prop);\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n const td = this.getCell(row, col);\n if (!td) {\n return;\n }\n td.classList.add(\"ht-demo-invalid-flash\");\n setTimeout(() => td.classList.remove(\"ht-demo-invalid-flash\"), 800);\n },\n};\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.ts.json index f8f8a1fe2..bd77bdad5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport type { CellMeta, CellProperties } from \"handsontable/settings\";\n\nregisterAllModules();\n\nconst STATUS_ROW_CLASSES: Record = {\n active: \"ht-demo-row-status-active\",\n pending: \"ht-demo-row-status-pending\",\n inactive: \"ht-demo-row-status-inactive\",\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== \"string\") {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: \"Invoice export\", owner: \"A. Lee\", status: \"active\" },\n { task: \"SSO rollout\", owner: \"M. Costa\", status: \"pending\" },\n { task: \"Legacy reports\", owner: \"J. Park\", status: \"inactive\" },\n { task: \"API docs\", owner: \"R. Singh\", status: \"active\" },\n { task: \"Mobile parity\", owner: \"T. Nguyen\", status: \"pending\" },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst hotOptions: Handsontable.GridSettings = {\n data,\n licenseKey: \"non-commercial-and-evaluation\",\n rowHeaders: true,\n colHeaders: [\"Task\", \"Owner\", \"Status\"],\n height: \"auto\",\n width: \"100%\",\n columns: [\n { data: \"task\", type: \"text\", width: 220 },\n { data: \"owner\", type: \"text\", width: 120 },\n {\n data: \"status\",\n type: \"dropdown\",\n width: 120,\n source: [\"active\", \"pending\", \"inactive\"],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(\n this: CellProperties,\n row: number,\n _column: number,\n _prop: string | number,\n ): CellMeta {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n\n const status = hot.getDataAtRowProp(visualRow, \"status\");\n const rowClass = statusToRowClass(status);\n\n if (!rowClass) {\n return {};\n }\n\n return { className: rowClass };\n },\n afterValidate(\n this: Handsontable,\n isValid: boolean,\n _value: Handsontable.CellValue,\n row: number,\n prop: string | number,\n ): void {\n if (isValid) {\n return;\n }\n\n const col = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n\n const td = this.getCell(row, col);\n\n if (!td) {\n return;\n }\n\n td.classList.add(\"ht-demo-invalid-flash\");\n setTimeout(() => td.classList.remove(\"ht-demo-invalid-flash\"), 800);\n },\n};\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from \"handsontable/base\";\nimport { registerAllModules } from \"handsontable/registry\";\nimport type { CellMeta, CellProperties } from \"handsontable/settings\";\n\nregisterAllModules();\n\nconst STATUS_ROW_CLASSES: Record = {\n active: \"ht-demo-row-status-active\",\n pending: \"ht-demo-row-status-pending\",\n inactive: \"ht-demo-row-status-inactive\",\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== \"string\") {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: \"Invoice export\", owner: \"A. Lee\", status: \"active\" },\n { task: \"SSO rollout\", owner: \"M. Costa\", status: \"pending\" },\n { task: \"Legacy reports\", owner: \"J. Park\", status: \"inactive\" },\n { task: \"API docs\", owner: \"R. Singh\", status: \"active\" },\n { task: \"Mobile parity\", owner: \"T. Nguyen\", status: \"pending\" },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector(\"#example1\")!;\n\nconst hotOptions: Handsontable.GridSettings = {\n data,\n licenseKey: \"non-commercial-and-evaluation\",\n rowHeaders: true,\n colHeaders: [\"Task\", \"Owner\", \"Status\"],\n height: \"auto\",\n width: \"100%\",\n columns: [\n { data: \"task\", type: \"text\", width: 220 },\n { data: \"owner\", type: \"text\", width: 120 },\n {\n data: \"status\",\n type: \"dropdown\",\n width: 120,\n source: [\"active\", \"pending\", \"inactive\"],\n strict: true,\n allowInvalid: false,\n },\n ],\n cells(\n this: CellProperties,\n row: number,\n _column: number,\n _prop: string | number,\n ): CellMeta {\n const hot = this.instance;\n const visualRow = hot.toVisualRow(row);\n\n if (visualRow === null || visualRow < 0) {\n return {};\n }\n\n const status = hot.getDataAtRowProp(visualRow, \"status\");\n const rowClass = statusToRowClass(status);\n\n if (!rowClass) {\n return {};\n }\n\n return { className: rowClass };\n },\n afterValidate(\n this: Handsontable,\n isValid: boolean,\n _value: Handsontable.CellValue,\n row: number,\n prop: string | number,\n ): void {\n if (isValid) {\n return;\n }\n\n const col = this.propToCol(prop);\n\n // Skip a property that names no column.\n if (col === null) {\n return;\n }\n\n const td = this.getCell(row, col);\n\n if (!td) {\n return;\n }\n\n td.classList.add(\"ht-demo-invalid-flash\");\n setTimeout(() => td.classList.remove(\"ht-demo-invalid-flash\"), 800);\n },\n};\n\n// eslint-disable-next-line no-unused-vars\nconst hot = new Handsontable(container, hotOptions);","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__react__example1.tsx.json index b1e5c6680..96dd0646d 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__conditional-row-coloring__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta, CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\nconst STATUS_ROW_CLASSES: Record = {\n active: 'ht-demo-row-status-active',\n pending: 'ht-demo-row-status-pending',\n inactive: 'ht-demo-row-status-inactive',\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== 'string') {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Invoice export', owner: 'A. Lee', status: 'active' },\n { task: 'SSO rollout', owner: 'M. Costa', status: 'pending' },\n { task: 'Legacy reports', owner: 'J. Park', status: 'inactive' },\n { task: 'API docs', owner: 'R. Singh', status: 'active' },\n { task: 'Mobile parity', owner: 'T. Nguyen', status: 'pending' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n td.classList.remove('ht-demo-invalid-flash'), 800);\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Conditional row coloring · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type { CellMeta, CellProperties } from 'handsontable/settings';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\nconst STATUS_ROW_CLASSES: Record = {\n active: 'ht-demo-row-status-active',\n pending: 'ht-demo-row-status-pending',\n inactive: 'ht-demo-row-status-inactive',\n};\n\nfunction statusToRowClass(status: unknown): string | undefined {\n if (typeof status !== 'string') {\n return undefined;\n }\n\n return STATUS_ROW_CLASSES[status];\n}\n\n/* start:skip-in-preview */\nconst data = [\n { task: 'Invoice export', owner: 'A. Lee', status: 'active' },\n { task: 'SSO rollout', owner: 'M. Costa', status: 'pending' },\n { task: 'Legacy reports', owner: 'J. Park', status: 'inactive' },\n { task: 'API docs', owner: 'R. Singh', status: 'active' },\n { task: 'Mobile parity', owner: 'T. Nguyen', status: 'pending' },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n td.classList.remove('ht-demo-invalid-flash'), 800);\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Scoped to the recipe preview container */\n#example1 td.ht-demo-row-status-active {\n background-color: rgba(26, 66, 232, 0.12);\n background-color: color-mix(in srgb, var(--ht-accent-color, #1a42e8) 12%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-pending {\n background-color: rgba(202, 138, 4, 0.14);\n background-color: color-mix(in srgb, var(--ht-warn-color, #ca8a04) 14%, var(--ht-background-color, #ffffff));\n}\n\n#example1 td.ht-demo-row-status-inactive {\n background-color: var(--ht-background-secondary-color, #f3f4f6);\n color: var(--ht-foreground-secondary-color, #6b7280);\n}\n\n/* Flash feedback for rejected edits (allowInvalid: false) */\n#example1 td.ht-demo-invalid-flash {\n background-color: var(--ht-cell-error-background-color, rgba(250, 77, 50, 0.2)) !important;\n color: inherit;\n}"},"docsPath":"recipes/rendering-styling/conditional-row-coloring/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Conditional row coloring"],"guide":"recipes/rendering-styling/conditional-row-coloring/conditional-row-coloring.md","guideTitle":"Conditional row coloring","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/conditional-row-coloring","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__angular__example1.ts.json index ee73b94fb..5a7c14fbb 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst tableData: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = tableData.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(tableData[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable): void {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-frozen-summary-row',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = tableData;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row: number, _col: number, prop: string | number): Handsontable.CellMeta {\n if (row !== summaryRowIndex) {\n return {};\n }\n\n const meta: Handsontable.CellMeta = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n\n if (prop !== 'item') {\n meta['type'] = 'text';\n meta['validator'] = undefined;\n meta['className'] = 'htSummaryRow htRight';\n }\n\n return meta;\n },\n afterInit(this: Handsontable): void {\n refreshSummary(this);\n },\n afterChange(\n this: Handsontable,\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource,\n ): void {\n if (!changes || (source as string) === SUMMARY_SOURCE) {\n return;\n }\n\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n },\n beforeUndoStackChange(\n _doneActions: unknown[],\n source: string | undefined,\n ): boolean | void {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport Handsontable from 'handsontable/base';\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst tableData: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = tableData.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(tableData[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable): void {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-frozen-summary-row',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = tableData;\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row: number, _col: number, prop: string | number): Handsontable.CellMeta {\n if (row !== summaryRowIndex) {\n return {};\n }\n\n const meta: Handsontable.CellMeta = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n\n if (prop !== 'item') {\n meta['type'] = 'text';\n meta['validator'] = undefined;\n meta['className'] = 'htSummaryRow htRight';\n }\n\n return meta;\n },\n afterInit(this: Handsontable): void {\n refreshSummary(this);\n },\n afterChange(\n this: Handsontable,\n changes: Handsontable.CellChange[] | null,\n source: Handsontable.ChangeSource,\n ): void {\n if (!changes || (source as string) === SUMMARY_SOURCE) {\n return;\n }\n\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n },\n beforeUndoStackChange(\n _doneActions: unknown[],\n source: string | undefined,\n ): boolean | void {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.js.json index 2b13d64b6..ca78b5540 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\nconst SUMMARY_SOURCE = 'updateSummary';\nfunction parseNumeric(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n if (Number.isFinite(n)) {\n return n;\n }\n }\n return null;\n}\nconst data = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\nconst numericProps = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\nfunction formatSummary(prop) {\n const numbers = [];\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n if (n !== null) {\n numbers.push(n);\n }\n }\n if (numbers.length === 0) {\n return '\\u2014';\n }\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\nfunction refreshSummary(hot) {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\nconst container = document.querySelector('#example1');\n// eslint-disable-next-line no-unused-vars -- recipe keeps instance for debugging\nconst hot = new Handsontable(container, {\n data,\n licenseKey: 'non-commercial-and-evaluation',\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row, _col, prop) {\n if (row !== summaryRowIndex) {\n return {};\n }\n const meta = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n if (prop !== 'item') {\n meta.type = 'text';\n meta.validator = undefined;\n meta.className = 'htSummaryRow htRight';\n }\n return meta;\n },\n afterInit() {\n refreshSummary(this);\n },\n afterChange(changes, source) {\n if (!changes || source === SUMMARY_SOURCE) {\n return;\n }\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n refreshSummary(this);\n },\n beforeUndoStackChange(_doneActions, source) {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nregisterAllModules();\nconst SUMMARY_SOURCE = 'updateSummary';\nfunction parseNumeric(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n if (Number.isFinite(n)) {\n return n;\n }\n }\n return null;\n}\nconst data = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\nconst numericProps = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\nfunction formatSummary(prop) {\n const numbers = [];\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n if (n !== null) {\n numbers.push(n);\n }\n }\n if (numbers.length === 0) {\n return '\\u2014';\n }\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\nfunction refreshSummary(hot) {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\nconst container = document.querySelector('#example1');\n// eslint-disable-next-line no-unused-vars -- recipe keeps instance for debugging\nconst hot = new Handsontable(container, {\n data,\n licenseKey: 'non-commercial-and-evaluation',\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row, _col, prop) {\n if (row !== summaryRowIndex) {\n return {};\n }\n const meta = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n if (prop !== 'item') {\n meta.type = 'text';\n meta.validator = undefined;\n meta.className = 'htSummaryRow htRight';\n }\n return meta;\n },\n afterInit() {\n refreshSummary(this);\n },\n afterChange(changes, source) {\n if (!changes || source === SUMMARY_SOURCE) {\n return;\n }\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n refreshSummary(this);\n },\n beforeUndoStackChange(_doneActions, source) {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.ts.json index 17df26566..28649b0c1 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst data: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable) {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\nconst container = document.querySelector('#example1')!;\n\n// eslint-disable-next-line no-unused-vars -- recipe keeps instance for debugging\nconst hot = new Handsontable(container, {\n data,\n licenseKey: 'non-commercial-and-evaluation',\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row, _col, prop) {\n if (row !== summaryRowIndex) {\n return {};\n }\n\n const meta: Handsontable.CellProperties = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n\n if (prop !== 'item') {\n meta.type = 'text';\n meta.validator = undefined;\n meta.className = 'htSummaryRow htRight';\n }\n\n return meta;\n },\n afterInit() {\n refreshSummary(this);\n },\n afterChange(changes, source) {\n if (!changes || source === SUMMARY_SOURCE) {\n return;\n }\n\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n },\n beforeUndoStackChange(_doneActions, source) {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\n\nregisterAllModules();\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst data: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable) {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\nconst container = document.querySelector('#example1')!;\n\n// eslint-disable-next-line no-unused-vars -- recipe keeps instance for debugging\nconst hot = new Handsontable(container, {\n data,\n licenseKey: 'non-commercial-and-evaluation',\n rowHeaders: true,\n colHeaders: ['Item', 'Units', 'Price', 'Tax'],\n fixedRowsBottom: 1,\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'item', type: 'text', readOnly: false },\n { data: 'units', type: 'numeric', numericFormat: { maximumFractionDigits: 0 } },\n { data: 'price', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n { data: 'tax', type: 'numeric', numericFormat: { minimumFractionDigits: 2, maximumFractionDigits: 2 } },\n ],\n cells(row, _col, prop) {\n if (row !== summaryRowIndex) {\n return {};\n }\n\n const meta: Handsontable.CellProperties = {\n readOnly: true,\n className: 'htSummaryRow',\n };\n\n if (prop !== 'item') {\n meta.type = 'text';\n meta.validator = undefined;\n meta.className = 'htSummaryRow htRight';\n }\n\n return meta;\n },\n afterInit() {\n refreshSummary(this);\n },\n afterChange(changes, source) {\n if (!changes || source === SUMMARY_SOURCE) {\n return;\n }\n\n if (changes.every(([row]) => row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n },\n beforeUndoStackChange(_doneActions, source) {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n },\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__react__example1.tsx.json index 106122777..cc1e21334 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__frozen-summary-row__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst data: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable): void {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\nconst ExampleComponent = () => {\n return (\n row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n }}\n beforeUndoStackChange={function (\n _doneActions: Handsontable.UndoRedoAction[],\n source: string | undefined,\n ): boolean | void {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Frozen summary row · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport type Handsontable from 'handsontable/base';\nimport './example1.css';\n\nregisterAllModules();\n\ntype Row = {\n item: string;\n units: number | string;\n price: number | string;\n tax: number | string;\n};\n\nconst SUMMARY_SOURCE = 'updateSummary';\n\nfunction parseNumeric(value: unknown): number | null {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const n = Number(value);\n\n if (Number.isFinite(n)) {\n return n;\n }\n }\n\n return null;\n}\n\nconst data: Row[] = [\n { item: 'Module A', units: 12, price: 49.5, tax: 5.2 },\n { item: 'Module B', units: 8, price: 120, tax: 8 },\n { item: 'Module C', units: 3, price: 200, tax: '\\u2014' },\n { item: 'Module D', units: 15, price: 35, tax: 4.1 },\n { item: 'Module E', units: 0, price: 75, tax: 6 },\n { item: '', units: '', price: '', tax: '' },\n];\n\nconst numericProps: (keyof Row)[] = ['units', 'price', 'tax'];\nconst summaryRowIndex = data.length - 1;\n\nfunction formatSummary(prop: keyof Row): string {\n const numbers: number[] = [];\n\n for (let row = 0; row < summaryRowIndex; row += 1) {\n const n = parseNumeric(data[row][prop]);\n\n if (n !== null) {\n numbers.push(n);\n }\n }\n\n if (numbers.length === 0) {\n return '\\u2014';\n }\n\n const sum = numbers.reduce((acc, n) => acc + n, 0);\n const avg = sum / numbers.length;\n\n return `Sum: ${sum.toFixed(2)}\\nAvg: ${avg.toFixed(2)}\\nCount: ${numbers.length}`;\n}\n\nfunction refreshSummary(hot: Handsontable): void {\n hot.batch(() => {\n hot.setDataAtRowProp(summaryRowIndex, 'item', 'Totals', SUMMARY_SOURCE);\n\n numericProps.forEach((prop) => {\n hot.setDataAtRowProp(summaryRowIndex, prop, formatSummary(prop), SUMMARY_SOURCE);\n });\n });\n}\n\nconst ExampleComponent = () => {\n return (\n row === summaryRowIndex)) {\n return;\n }\n\n refreshSummary(this);\n }}\n beforeUndoStackChange={function (\n _doneActions: Handsontable.UndoRedoAction[],\n source: string | undefined,\n ): boolean | void {\n if (source === SUMMARY_SOURCE) {\n return false;\n }\n }}\n />\n );\n};\n\nexport default ExampleComponent;","/src/example1.css":".htSummaryRow {\n font-weight: 600;\n}\n\n/* The summary row is always read-only, so Handsontable applies its built-in .htDimmed\n background with `!important`. Match that specificity and add `!important` here too,\n so this rule - not the default read-only style - decides the summary row's background. */\n.handsontable .htSummaryRow.htDimmed {\n background-color: var(--ht-background-secondary-color, #f2f3f5) !important;\n}"},"docsPath":"recipes/rendering-styling/frozen-summary-row/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Frozen summary row"],"guide":"recipes/rendering-styling/frozen-summary-row/frozen-summary-row.md","guideTitle":"Frozen summary row","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/frozen-summary-row","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__angular__example1.ts.json index 24b5506af..ef7486720 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (\n instance,\n td,\n row,\n col,\n prop,\n value,\n cellProperties,\n) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { CELL_TYPE: 'sparklineBar', renderer: sparklineRenderer });\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-sparkline-cell-renderer',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: undefined,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n.handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":8,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [\n \"src/styles.css\"\n ],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (\n instance,\n td,\n row,\n col,\n prop,\n value,\n cellProperties,\n) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { CELL_TYPE: 'sparklineBar', renderer: sparklineRenderer });\n\n@Component({\n standalone: true,\n imports: [HotTableModule],\n selector: 'example1-sparkline-cell-renderer',\n template: `\n
    \n \n
    \n `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: undefined,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};","/src/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n.handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/angular/example1.ts","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.js.json index 6f01f5450..90ae1f207 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'];\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData) {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row);\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n) => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: null,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'];\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData) {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row);\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n) => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: null,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n});","/src/main.js":"import \"../styles.css\";\nimport \"../index.js\";","/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/javascript/example1.js","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.ts.json index 3ebe9358f..8f23411f5 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (\n instance,\n td,\n row,\n col,\n prop,\n value,\n cellProperties\n) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(\n row\n ) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average =\n validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: null,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (\n instance,\n td,\n row,\n col,\n prop,\n value,\n cellProperties\n) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(\n row\n ) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average =\n validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n data,\n rowHeaders: true,\n rowHeights: 44,\n colHeaders: ['Product', 'W1', 'W2', 'W3', 'W4', 'W5', 'Sparkline'],\n licenseKey: 'non-commercial-and-evaluation',\n height: 'auto',\n width: '100%',\n columns: [\n { data: 'product', type: 'text', width: 100, readOnly: true },\n { data: 'w1', type: 'numeric', width: 48 },\n { data: 'w2', type: 'numeric', width: 48 },\n { data: 'w3', type: 'numeric', width: 48 },\n { data: 'w4', type: 'numeric', width: 48 },\n { data: 'w5', type: 'numeric', width: 48 },\n {\n data: null,\n width: 160,\n type: 'sparklineBar',\n className: 'htMiddle sparkline-cell',\n readOnly: true,\n },\n ],\n});","/src/main.ts":"import \"../styles.css\";\nimport \"../index.ts\";","/styles.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/javascript/example1.ts","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__react__example1.tsx.json index c21e95091..234feddf9 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__rendering-styling__sparkline-cell-renderer__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport './example1.css';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"React (TS)"} +{"framework":"react","displayName":"Recipes ▸ Rendering Styling ▸ Sparkline cell renderer · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":6,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { BaseRenderer, registerRenderer, baseRenderer } from 'handsontable/renderers';\nimport { registerCellType } from 'handsontable/cellTypes';\nimport './example1.css';\n\nregisterAllModules();\n\nconst SLOT = 10;\nconst GAP = 2;\nconst VIEW_HEIGHT = 100;\nconst WEEK_KEYS = ['w1', 'w2', 'w3', 'w4', 'w5'] as const;\nconst VIEW_WIDTH = WEEK_KEYS.length * SLOT - GAP;\n\n// Returns null for invalid/non-numeric values, preserving each slot's position.\nfunction toSlots(rowData: Record | null): (number | null)[] {\n return WEEK_KEYS.map((key) => {\n const value = rowData?.[key];\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isFinite(n) ? n : null;\n });\n}\n\n// Inline SVG bar chart generated from the row's w1-w5 values.\nconst sparklineRenderer: BaseRenderer = (instance, td, row, col, prop, value, cellProperties) => {\n baseRenderer(instance, td, row, col, prop, value, cellProperties);\n\n const sourceRow = instance.getSourceDataAtRow(row) as Record | null;\n const slots = toSlots(sourceRow);\n const validNumbers = slots.filter((n): n is number => n !== null);\n\n if (validNumbers.length === 0) {\n td.textContent = '—';\n td.title = 'No data';\n return;\n }\n\n const rowMax = validNumbers.reduce((m, n) => Math.max(m, Math.abs(n)), 0);\n\n if (rowMax === 0) {\n td.textContent = '—';\n td.title = 'All values are zero';\n return;\n }\n\n const average = validNumbers.reduce((sum, n) => sum + n, 0) / validNumbers.length;\n const rects = slots\n .map((n, i) => {\n if (n === null) return '';\n const barHeight = (Math.abs(n) / rowMax) * VIEW_HEIGHT;\n const x = i * SLOT;\n const y = VIEW_HEIGHT - barHeight;\n const w = SLOT - GAP;\n const fill = n >= average ? '#16a34a' : '#dc2626';\n\n return ``;\n })\n .join('');\n\n td.innerHTML = `${rects}`;\n td.removeAttribute('title');\n};\n\nregisterRenderer('sparklineBar', sparklineRenderer);\nregisterCellType('sparklineBar', { renderer: sparklineRenderer });\n\n/* start:skip-in-preview */\nconst data = [\n { product: 'Desk lamp', w1: 4, w2: 8, w3: 2, w4: 9, w5: 5 },\n { product: 'Monitor arm', w1: 1, w2: 1, w3: 0, w4: 0, w5: 0 },\n { product: 'USB hub', w1: null, w2: null, w3: null, w4: null, w5: null },\n { product: 'Mouse', w1: undefined, w2: undefined, w3: 3, w4: 5, w5: 2 },\n { product: 'Keyboard', w1: 3, w2: 6, w3: 7, w4: 4, w5: 8 },\n { product: 'Webcam', w1: 0, w2: 0, w3: 0, w4: 0, w5: 0 },\n];\n/* end:skip-in-preview */\n\nconst ExampleComponent = () => {\n return (\n \n );\n};\n\nexport default ExampleComponent;","/src/example1.css":"/* Keep sparkline cells vertically centered and tall enough for the SVG */\n#example1 .handsontable td.sparkline-cell {\n vertical-align: middle;\n}"},"docsPath":"recipes/rendering-styling/sparkline-cell-renderer/react/example1.tsx","breadcrumb":["Recipes","Rendering Styling","Sparkline cell renderer"],"guide":"recipes/rendering-styling/sparkline-cell-renderer/sparkline-cell-renderer.md","guideTitle":"Sparkline cell renderer","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/rendering-styling/sparkline-cell-renderer","lang":"React (TS)"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__angular__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__angular__example1.ts.json index 6261ae59a..aa380c707 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__angular__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__angular__example1.ts.json @@ -1 +1 @@ -{"framework":"angular","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\n@Component({\n selector: 'example1-tabler-icons',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// Register Handsontable's modules.\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/themes/tabler-icons/angular/example1.ts","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"Angular"} +{"framework":"angular","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · Angular","tier":2,"engine":"container","sandpackTemplate":null,"sandpackEnvironment":null,"container":"angular","htWrappers":["@handsontable/angular-wrapper"],"entry":"/src/main.ts","htmlEntry":"/src/index.html","devCommand":"pnpm exec ng serve --host 0.0.0.0 --port 3000","buildCommand":"ng build","outputDir":"dist","outputGlob":"dist/*/browser","staticExport":false,"spaMode":false,"port":3000,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":7,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-angular-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"scripts\": {\n \"ng\": \"ng\",\n \"start\": \"ng serve\",\n \"build\": \"ng build\"\n },\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"@handsontable/angular-wrapper\": \"0.0.0-next-193d031-20261028\",\n \"@angular/animations\": \"22.0.6\",\n \"@angular/common\": \"22.0.6\",\n \"@angular/compiler\": \"22.0.6\",\n \"@angular/core\": \"22.0.6\",\n \"@angular/forms\": \"22.0.6\",\n \"@angular/platform-browser\": \"22.0.6\",\n \"@angular/platform-browser-dynamic\": \"22.0.6\",\n \"@angular/router\": \"22.0.6\",\n \"rxjs\": \"~7.8.2\",\n \"tslib\": \"^2.8.1\",\n \"zone.js\": \"~0.16.2\",\n \"@angular-devkit/build-angular\": \"22.0.6\",\n \"@angular/cli\": \"22.0.6\",\n \"@angular/compiler-cli\": \"22.0.6\",\n \"typescript\": \"~6.0.3\"\n },\n \"devDependencies\": {}\n}","/angular.json":"{\n \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n \"version\": 1,\n \"newProjectRoot\": \"projects\",\n \"projects\": {\n \"app\": {\n \"projectType\": \"application\",\n \"root\": \"\",\n \"sourceRoot\": \"src\",\n \"prefix\": \"app\",\n \"architect\": {\n \"build\": {\n \"builder\": \"@angular-devkit/build-angular:application\",\n \"options\": {\n \"outputPath\": \"dist/app\",\n \"index\": \"src/index.html\",\n \"browser\": \"src/main.ts\",\n \"polyfills\": [\n \"zone.js\"\n ],\n \"tsConfig\": \"tsconfig.json\",\n \"assets\": [],\n \"styles\": [],\n \"scripts\": []\n },\n \"configurations\": {\n \"development\": {\n \"optimization\": false,\n \"sourceMap\": true\n }\n },\n \"defaultConfiguration\": \"development\"\n },\n \"serve\": {\n \"builder\": \"@angular-devkit/build-angular:dev-server\",\n \"configurations\": {\n \"development\": {\n \"buildTarget\": \"app:build:development\"\n }\n },\n \"defaultConfiguration\": \"development\"\n }\n }\n }\n }\n}","/tsconfig.json":"{\n \"compilerOptions\": {\n \"outDir\": \"./dist/out-tsc\",\n \"strict\": true,\n \"noImplicitOverride\": true,\n \"noPropertyAccessFromIndexSignature\": true,\n \"noImplicitReturns\": true,\n \"noFallthroughCasesInSwitch\": true,\n \"skipLibCheck\": true,\n \"esModuleInterop\": true,\n \"sourceMap\": true,\n \"declaration\": false,\n \"experimentalDecorators\": true,\n \"moduleResolution\": \"bundler\",\n \"importHelpers\": true,\n \"target\": \"ES2022\",\n \"module\": \"ES2022\",\n \"useDefineForClassFields\": false,\n \"lib\": [\n \"ES2022\",\n \"dom\"\n ]\n },\n \"angularCompilerOptions\": {\n \"enableI18nLegacyMessageIdFormat\": false,\n \"strictInjectionParameters\": true,\n \"strictInputAccessModifiers\": true,\n \"strictTemplates\": true\n }\n}","/src/index.html":"\n\n\n \n Handsontable Angular Example\n \n \n\n\n
    \n \n
    \n\n","/src/main.ts":"import { bootstrapApplication } from '@angular/platform-browser';\nimport { registerAllModules } from 'handsontable/registry';\nimport { AppComponent } from './app/app.component';\nimport { appConfig } from './app/app.config';\n\nregisterAllModules();\n\nbootstrapApplication(AppComponent, appConfig).catch(err => console.error(err));","/src/app/app.component.ts":"import { Component } from '@angular/core';\nimport { GridSettings, HotTableModule } from '@handsontable/angular-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\n@Component({\n selector: 'example1-tabler-icons',\n standalone: true,\n imports: [HotTableModule],\n template: `
    \n \n
    `,\n})\nexport class AppComponent {\n readonly data = [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ];\n\n readonly gridSettings: GridSettings = {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n };\n}","/src/app/app.config.ts":"import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { registerAllModules } from 'handsontable/registry';\nimport { HOT_GLOBAL_CONFIG, HotGlobalConfig, NON_COMMERCIAL_LICENSE } from '@handsontable/angular-wrapper';\n\n// Register Handsontable's modules.\nregisterAllModules();\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n {\n provide: HOT_GLOBAL_CONFIG,\n useValue: { license: NON_COMMERCIAL_LICENSE } as HotGlobalConfig,\n },\n ],\n};"},"docsPath":"recipes/themes/tabler-icons/angular/example1.ts","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"Angular"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.js.json b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.js.json index 431268163..49b536b91 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.js.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.js.json @@ -1 +1 @@ -{"framework":"javascript","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n data: [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ],\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/themes/tabler-icons/javascript/example1.js","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"JavaScript"} +{"framework":"javascript","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · JavaScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.js","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.js":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\nconst container = document.querySelector('#example1');\n\nnew Handsontable(container, {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n data: [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ],\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.js":"import \"../index.js\";"},"docsPath":"recipes/themes/tabler-icons/javascript/example1.js","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"JavaScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.ts.json b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.ts.json index a40e4447e..76c74c993 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.ts.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__javascript__example1.ts.json @@ -1 +1 @@ -{"framework":"typescript","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n data: [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ],\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/themes/tabler-icons/javascript/example1.ts","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"TypeScript"} +{"framework":"typescript","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · TypeScript","tier":1,"engine":"sandpack","sandpackTemplate":"vanilla-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":[],"entry":"/src/main.ts","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-193d031-20261028","fileCount":4,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-193d031-20261028\",\n \"vite\": \"^5.4.0\",\n \"typescript\": \"^5.4.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/index.html":"\n\n\n \n \n Handsontable Example\n \n\n\n
    \n \n\n","/index.ts":"import Handsontable from 'handsontable/base';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\nconst container = document.querySelector('#example1')!;\n\nnew Handsontable(container, {\n // The mapping applies only when the theme is passed as an object.\n theme: tablerTheme,\n data: [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n ],\n columns: [\n { data: 'product' },\n { data: 'category', type: 'dropdown', source: ['Furniture', 'Accessories', 'Electronics', 'Lighting'] },\n { data: 'inStock', type: 'checkbox' },\n { data: 'units', type: 'numeric' },\n ],\n colHeaders: ['Product', 'Category', 'In stock', 'Units'],\n rowHeaders: true,\n columnSorting: true,\n dropdownMenu: true,\n filters: true,\n // The hidden Units column puts a caret on the In stock header.\n hiddenColumns: { columns: [3], indicators: true },\n height: 260,\n licenseKey: 'non-commercial-and-evaluation',\n});","/src/main.ts":"import \"../index.ts\";"},"docsPath":"recipes/themes/tabler-icons/javascript/example1.ts","breadcrumb":["Recipes","Themes","Handsontable DataGrid with Tabler Icons"],"guide":"recipes/themes/tabler-icons/tabler-icons.md","guideTitle":"Handsontable DataGrid with Tabler Icons","exampleId":"example1","exampleTitle":"Standard example","docPermalink":"/recipes/themes/tabler-icons","lang":"TypeScript"} diff --git a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__react__example1.tsx.json b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__react__example1.tsx.json index 4ba5c72b8..1efaba8c8 100644 --- a/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__react__example1.tsx.json +++ b/runner/apps/authoring/public/docs-examples/next/recipes__themes__tabler-icons__react__example1.tsx.json @@ -1 +1 @@ -{"framework":"react","displayName":"Recipes ▸ Themes ▸ Handsontable DataGrid with Tabler Icons · Standard example · React (TS)","tier":1,"engine":"sandpack","sandpackTemplate":"react-ts","sandpackEnvironment":"parcel","container":null,"htWrappers":["@handsontable/react-wrapper"],"entry":"/src/main.tsx","htmlEntry":"/index.html","devCommand":null,"buildCommand":"vite build","outputDir":"dist","outputGlob":null,"staticExport":false,"spaMode":false,"port":null,"installCommand":"pnpm install","htCoreRange":"0.0.0-next-36242d6-20261027","fileCount":5,"assets":[],"skipped":[],"files":{"/package.json":"{\n \"name\": \"handsontable-react-example\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"packageManager\": \"pnpm@10.34.5\",\n \"dependencies\": {\n \"handsontable\": \"0.0.0-next-36242d6-20261027\",\n \"@handsontable/react-wrapper\": \"0.0.0-next-36242d6-20261027\",\n \"react\": \"18.x\",\n \"react-dom\": \"18.x\",\n \"vite\": \"^5.4.0\",\n \"@vitejs/plugin-react\": \"^4.0.0\"\n },\n \"scripts\": {\n \"start\": \"vite\",\n \"build\": \"vite build\"\n }\n}","/vite.config.js":"import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\n\nexport default defineConfig({ plugins: [react()] });","/index.html":"\n\n\n \n \n Handsontable React Example\n \n\n\n
    \n \n\n","/src/main.tsx":"import React from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nconst root = createRoot(document.getElementById(\"example1\"));\nroot.render(React.createElement(App));","/src/App.tsx":"import { HotTable } from '@handsontable/react-wrapper';\nimport { registerAllModules } from 'handsontable/registry';\nimport { mainTheme, registerTheme } from 'handsontable/themes';\n\n// Register all Handsontable's modules.\nregisterAllModules();\n\n/* start:skip-in-preview */\n// In your project, install `@tabler/icons-webfont` and import its stylesheet instead.\nconst tablerCss = document.createElement('link');\n\ntablerCss.rel = 'stylesheet';\ntablerCss.href = 'https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.31.0/dist/tabler-icons.min.css';\ndocument.head.appendChild(tablerCss);\n/* end:skip-in-preview */\n\n// Every icon slot the grid renders, mapped to a Tabler Icons class list.\nconst tablerTheme = registerTheme(mainTheme);\n\ntablerTheme.params({\n icons: {\n arrowRight: 'ti ti-chevron-right',\n arrowRightWithBar: 'ti ti-chevron-right-pipe',\n arrowLeft: 'ti ti-chevron-left',\n arrowLeftWithBar: 'ti ti-chevron-left-pipe',\n arrowDown: 'ti ti-chevron-down',\n menu: 'ti ti-menu-2',\n selectArrow: 'ti ti-caret-down-filled',\n arrowNarrowUp: 'ti ti-arrow-narrow-up',\n arrowNarrowDown: 'ti ti-arrow-narrow-down',\n check: 'ti ti-check',\n checkbox: 'ti ti-check',\n caretHiddenLeft: 'ti ti-caret-left-filled',\n caretHiddenRight: 'ti ti-caret-right-filled',\n caretHiddenUp: 'ti ti-caret-up-filled',\n caretHiddenDown: 'ti ti-caret-down-filled',\n collapseOff: 'ti ti-minus',\n collapseOn: 'ti ti-plus',\n radio: 'ti ti-point-filled',\n chipClose: 'ti ti-x',\n search: 'ti ti-search',\n plus: 'ti ti-plus',\n menuList: 'ti ti-list',\n },\n});\n\nconst data = [\n { product: 'Standing desk', category: 'Furniture', inStock: true, units: 24 },\n { product: 'Monitor arm', category: 'Accessories', inStock: true, units: 61 },\n { product: 'Ergonomic chair', category: 'Furniture', inStock: false, units: 0 },\n { product: 'USB-C dock', category: 'Electronics', inStock: true, units: 138 },\n { product: 'Desk lamp', category: 'Lighting', inStock: true, units: 45 },\n { product: 'Cable tray', category: 'Accessories', inStock: false, units: 0 },\n];\n\nconst ExampleComponent = () => {\n return (\n